刷新observableArray当项目不可观(Refresh observableArray wh

2019-07-03 14:23发布

基本上我有一个observableArray并为每个项目中的值不是一个可观察的。 这意味着,当我改变的项目值的observableArray的foreach循环内的用户界面不会相应地更新。

这意味着一个巨大的变化,如果我有将它们设置为可观察到的,那么有没有一种方法,我可以刷新无论是UI或手动observableArray的foreach?

Answer 1:

是的,你可以调用valueHasMutated功能为您的数组:

yourArray.valueHasMutated();

编辑:如果第一次没有帮助,你可以做“脏”刷新:

self.refresh = function(){
    var data = self.array().slice(0);
    self.array([]);
    self.array(data);
};

这里是工作提琴: http://jsfiddle.net/vyshniakov/FuEy6/2/



Answer 2:

当你有非可观察的要素可观察到的阵列,并在阵列变化的要素之一的某些属性,如果你想只刷新该元素,你可以使用indexOfsplice ,就像这样:

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被无证(和供内部使用,我认为),只检查数组本身发生了变化,如果没有在数组中的不可观测的因素发生了变化,所以这是行不通的。 即,它仅在已添加元素到阵列检测,从数组移除的元件,改变所述阵列的元素与新的,不同的元件,或者改变了的元素的顺序。 不过,这并不检查元素本身已经改变



Answer 3:

我结束了使用从上面的脏的方法,但说得那么我所有的可观测阵列有这个功能。

ko.observableArray.fn.refresh = function () {
        var data = this().slice(0);
        this([]);
        this(data);
    };

该valueHasMutated并没有为我工作。 它的一种跛脚的整个列表中已被更新。 或者对于我来说找到一个方法来延长KO映射插件与观察对象,以填补观察到的阵列..



Answer 4:

我通过更换阵列中的整个对象中发现一个简单的解决方案。

在这个例子中参数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;
}


Answer 5:

我使用的是淘汰赛与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指定索引。



文章来源: Refresh observableArray when items are not observables
标签: knockout.js