【发布时间】:2014-11-01 16:58:58
【问题描述】:
我有一个 observable,比如 myValue。这个 observable 有一些属性,比如 id,也是 observable。我定义了一个自定义绑定来处理 myValue 的更改。 当我更改可观察属性 id 的值时,会触发 myValue 的自定义绑定。 这是非常不可取的,因为我的自定义绑定中的更新功能非常昂贵,而且我遇到了性能问题。 有没有办法防止父可观察对象与其未更新的子对象一起更新?
代码的核心部分
//model opening, declaration, initialize...
//In the model
var self = this;
this.myValue = ko.observable();
this.myValue("Some value");
this.myValue.id = 123;
this.changeId = function() {
self.myValue.id(111); //here the update for myValue is triggered
}
//After the model
ko.bindingHandlers.customBinding = {
init: function init(element, valueAccessor, allBindingsAccessor)
{/*nothing*/},
update: function(element, valueAccessor, allBindingsAccessor) {
/*expensive code*/
console.log("I am being executed every time myValue.id() is changed...");
}
}
//Then the model is applied...
ko.applyBindings(model);
编辑:我暗示是否有办法改变 myValue.id 而不消除其可观察性。声明 myValue.id 不可观察可以解决问题,但我需要它是可观察的,所以我只会将此解决方案用作最后的更改。 无论如何,声明 myValue.id 不可观察会解决问题吗?我还没查过
【问题讨论】:
-
是的,只是不要使用 observable。它仍然会获得双向绑定,但不会做任何通知。你必须自己做这些。相关小提琴:jsfiddle.net/841rsfk3
-
是的,我尝试并看到了不可观察的属性,当更改时,不会触发对父可观察对象的订阅或绑定。没有任何方法可以防止将“泡沫”更新为父可观察对象吗?
-
也许吧。不过,现在我认为您的代码甚至都不会运行,所以我不能肯定地说。我认为
this.myValue.id = 123;和self.myValue.id(111);会爆炸。 -
它在函数构造函数内部,所以在声明时,模型类似于 var model = new ModelConstructor();这样 this 引用新创建的模型对象“模型”,传递给 ko.applyBindings。很抱歉没有发布所有代码,我只是专注于我的问题。
标签: javascript knockout.js subscription observable