knockout.js获胜't更新我的foreach绑定,尽管更改已注册

knockout.js won't update my foreach binding although the change is registered

本文关键字:绑定 注册 foreach 我的 获胜 js 更新 knockout      更新时间:2023-09-26

我正在尝试使用jQuery的animate方法为observableArray中的对象设置动画。为了做到这一点,我使用了我制作动画的数组的中介副本,然后将其值重新应用于observableArray,如:

function VM(){
    var self = this;
    this.array =  ko.observableArray([{val:2},{val:4}]);
    this.array.subscribe(function(changeset){
        console.log('updating values', JSON.stringify(self.array())); //this fires just fine
    });
};
var model = new VM();
ko.applyBindings(model);
var mediator = ko.toJS(model.array);

var target = [{val:200},{val:400}];
$.each(mediator, function(i, el){
    $(el).animate(target[i], {
        duration : 500,
        progress : function(){
            model.array(mediator);
        }
    });
});

值更新得很好(订阅的函数会触发并提供正确的结果),但当我尝试将其与此视图绑定时:

<div data-bind="foreach: array">
    <p data-bind="text:val"></p>
</div>

它从不更新。看小提琴:http://jsfiddle.net/JKALt/2/

知道我在这里做错了什么吗?

我设法让一些东西发挥作用,告诉我如果有帮助,看看这个小提琴:http://jsfiddle.net/JKALt/3/

主要变化是

this.array =  ko.observableArray([ko.observable({val:2}),ko.observable({val:4})]);

我认为问题在于:创建一个可观察数组并不意味着数组中的对象是可观察的。您必须使数组中的项可见。

关键点:observableArray跟踪哪些对象在数组中,而不是这些对象的状态

来自http://knockoutjs.com/documentation/observableArrays.html

还要注意,您必须更新可观察性的值。不过,我认为可以找到一种更好的更新方式。

progress : function(){
  model.array()[0](mediator[0]);
  model.array()[1](mediator[1]);
}