1

我有一个简单的 ko 可观察客户对象数组。视图中是一个使用 table/tr/td html 元素的简单 foreach 数据绑定。客户对象的属性之一是“注释”字段,最多可包含 1000 个字符。

当视图首次加载时,我将“notes”属性的文本属性绑定到一个函数,该函数返回带有“....”的注释的前 100 个字符,以指示如果适用,还有更多文本。

如果用户单击复选框以“查看完整注释”,我想刷新注释列,只是这次我不对其进行子串化,而是显示整个值。如何让 KO 重新评估 foreach,具体来说,我可以只刷新注释列吗?

在这个过程中,实际可观察​​到的数组值根本没有改变,只是显示在改变。

(如果重要,使用 durandal 2.0 框架)

4

1 回答 1

1

可以使用计算的 observable 来完成,如下所示(小提琴:http: //jsfiddle.net/MA8Mu/2/):

html:

showFullNotes: <input type="checkbox" data-bind="checked:showFullNotes" /><br />
<table>
    <tbody data-bind="foreach:customers">
        <tr>
            <td>
                <span data-bind="text:actualNotes"></span>
            </td>
        </tr>
    </tbody>
</table>

js:

var Customer = function(notes, parent ){
    var self = this;
    self.notes = ko.observable(notes);

    self.actualNotes = ko.computed(function() {
        if (parent.showFullNotes()){
            return self.notes();
        } else {
            return self.notes().substring(0,5) + "...";
        }
    }, self);
} 


var VM = function(){
    var self = this;
    self.showFullNotes = ko.observable(false);
    self.customers = ko.observableArray(
        [new Customer("123456789", self),
        new Customer("abcderfgh", self)]
    );
}

var vm = new VM();
    ko.applyBindings(vm);
于 2013-11-09T07:52:00.440 回答