【问题标题】:Observable notify parent ObservableArrayObservable 通知父 ObservableArray
【发布时间】:2013-11-02 03:23:04
【问题描述】:

我有一个 observableArray fieldChoices,其中包含类似以下的 observable:{ 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 值发生变化时,我无法让可观察对象通知可观察数组。我尝试添加自定义绑定test: name() 并从那里通知。问题是值改变时绑定没有更新。

我怎样才能让它工作?

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

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

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

    创建一个可观察的数组 -

    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));
    });
    

    【讨论】:

    • 我的主要目标是让 computed 重新评估 observable 的值何时发生变化。我认为有一种方法可以在自定义绑定中的值更改时获取订阅,并从那里强制 computed 重新评估。但我会尝试使用扩展器,因为我应该解决它。
    • @razvan 您需要做的只是在计算上创建一个 write: 函数并从该扩展器写入它...
    【解决方案2】:

    您的 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 时已经循环访问它们,那么您可以订阅每个对象的名称属性。

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多