0

我有一个 observableArray fieldChoices,其中包含以下 observables:{ name: ko.observable('new choice') }

我想让 Observables 通知必须通知另一个计算的 ObservableArray。

我像这样绑定它们:

 <div data-bind="foreach: $parent.fieldChoices">
     <div>
        <i class="icon-caret-right"></i>
        <input type="text" class="span8" data-bind="value: name(), test: name()" />
        <i class="icon-arrow-up" data-bind="click: $parentContext.$parent.shiftChoiceUp, visible: $index() !== 0"></i>
        <i class="icon-arrow-down" data-bind="click: $parentContext.$parent.shiftChoiceDown, visible: $index() !== ($parentContext.$parent.fieldChoices().length - 1)"></i>
        <i class="icon-remove" data-bind="click: $parentContext.$parent.removeChoice, visible: $parentContext.$parent.fieldChoices().length > 2"></i>
     </div>
</div>

name当值发生变化时,我无法让 observables 通知 observable 数组。我尝试添加自定义绑定test: name()并从那里通知。问题是值更改时绑定没有更新。

我怎样才能得到这个工作?

编辑:即使有类似的问题,我也试图通过自定义绑定来解决这个问题。我无法为这种方法找到任何解决方案。

4

2 回答 2

1

这个问题对我来说没有多大意义,因为默认情况下您所描述的内容是有效的(当值发生变化时,可观察对象会通知他们的订阅者)。您可以为您的可观察对象创建一个扩展器,如果您愿意,可以显式通知您的 observableArray,但您可能不想通知 observableArray 可观察对象已更改(因为它不会通知其他任何人,因为它的没有改变) 你可能只想做一些常见的功能 -

创建一个可观察的数组 -

var myArray = ko.observableArray();

注册一个扩展器 -

ko.extenders.trackChildChanges = function (target, value) {
    target.subscribe(function () {
        // Do some notification
    });
    return target;
};

然后创建你的 observables 并扩展它们 -

function child(object) {
    var self = this;
    self.Id = ko.observable(id).extend({trackChildChanges: true});
    self.Name = ko.observable(name)extend({trackChildChanges: true});
}

var regArray = [{ id: 1, name: 'Bill'}, {id: 2, name: 'John'}];

$.each(regArray, function(index, item) {
    myArray.push(new child(item));
});
于 2013-11-01T17:10:06.303 回答
0

您的 fieldChoices (可观察数组)在添加项目并从数组中获取时更新,而不是在项目更改值时更新。我建议您订阅数组中的每个项目。

var thingsToDoWhenAnItemsNamePropertyChanges = function(NewValue){
    alert('An items name property change to '+NewValue);
}
var arr = fieldChoices();
for(var i=0, cnt=arr.length;i<cnt;i++){
   var item = arr[i];
   var nm = item && item.name;
   if(typeof(nm.subscribe) === 'function')nm.subscribe(thingsToDoWhenAnItemsNamePropertyChanges);
}

或者,如果您在将项目加载到 fieldChoices 时已经遍历这些项目,那么您可以订阅每个对象名称属性。

于 2013-11-01T19:23:04.543 回答