基本上我有一个observableArray并为每个项目中的值不是一个可观察的。 这意味着,当我改变的项目值的observableArray的foreach循环内的用户界面不会相应地更新。
这意味着一个巨大的变化,如果我有将它们设置为可观察到的,那么有没有一种方法,我可以刷新无论是UI或手动observableArray的foreach?
基本上我有一个observableArray并为每个项目中的值不是一个可观察的。 这意味着,当我改变的项目值的observableArray的foreach循环内的用户界面不会相应地更新。
这意味着一个巨大的变化,如果我有将它们设置为可观察到的,那么有没有一种方法,我可以刷新无论是UI或手动observableArray的foreach?
是的,你可以调用valueHasMutated
功能为您的数组:
yourArray.valueHasMutated();
编辑:如果第一次没有帮助,你可以做“脏”刷新:
self.refresh = function(){
var data = self.array().slice(0);
self.array([]);
self.array(data);
};
这里是工作提琴: http://jsfiddle.net/vyshniakov/FuEy6/2/
当你有非可观察的要素可观察到的阵列,并在阵列变化的要素之一的某些属性,如果你想只刷新该元素,你可以使用indexOf
和splice
,就像这样:
var changedIdx = obsArray.indexOf(changedItem);
obsArray.splice(changedIdx , 1); // removes the item from the array
obsArray.splice(changedIdx , 0, changedItem); // adds it back
这里做的事情,正在寻找数组中的元素,删除它,并将其插入回来。 当它插回,元素再次被束缚,用新值。
如果你喜欢这个解决方案,可以延长所有KO观察到的阵列,像这样的功能:
ko.observableArray.fn.refresh = function (item) {
var index = this['indexOf'](item);
if (index >= 0) {
this.splice(index, 1);
this.splice(index, 0, item);
}
}
然后,当您更改数组的一个项目,你只需拨打这个电话:
obsArray.refresh(changedItem);
如果你有你的数组中的很多元素,你会得到改善服务表现关于dirty
的阿尔乔姆Vyshniakov,其更新绑定在阵列中的所有元素,而不是只为改变一个刷新。
注: valueHasMutated
,APPART被无证(和供内部使用,我认为),只检查数组本身发生了变化,如果没有在数组中的不可观测的因素发生了变化,所以这是行不通的。 即,它仅在已添加元素到阵列检测,从数组移除的元件,改变所述阵列的元素与新的,不同的元件,或者改变了的元素的顺序。 不过,这并不检查元素本身已经改变
我结束了使用从上面的脏的方法,但说得那么我所有的可观测阵列有这个功能。
ko.observableArray.fn.refresh = function () {
var data = this().slice(0);
this([]);
this(data);
};
该valueHasMutated并没有为我工作。 它的一种跛脚的整个列表中已被更新。 或者对于我来说找到一个方法来延长KO映射插件与观察对象,以填补观察到的阵列..
我通过更换阵列中的整个对象中发现一个简单的解决方案。
在这个例子中参数IX是索引,oLine是更新的对象和oVM.objProps.lines包含阵列。 该解决方案的工作就像一个冠军。
/* This contortion causes the computed function to fire because
* we have replaced the entire line object.
*/
function forceRefresh(ix,oLine) {
var oVM = pme.getVM();
oLine = JSON.parse(JSON.stringify(oLine));
oVM.oObjProp.lines[ix] = oLine;
}
我使用的是淘汰赛与deferUpdates和JotaBe的解决方案需要更新。
这似乎淘汰赛检测,在删除/添加,这是相同的项目,所以不要刷新阵列。
我已经采用了以下解决方案:
ko.observableArray.fn.refresh = function (item, index) {
if (index==null) index = this['indexOf'](item);
if (index >= 0) {
this.splice(index, 1, ko.utils.extend({}, item)) // create new item
//this.splice(index, 1);
//this.splice(index, 0, item);
}
}
它正确地刷新阵! :-)
注意:我添加了第二个参数刷新功能,当指数给出,避免运行的indexOf指定索引。