我有一个可观察的,比如myValue。这个observable有一些属性,比如id,也是可观察的。我定义了一个自定义绑定来处理myValue更改。 当我更改observable属性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无法观察到解决问题吗?我还没检查过
答案 0 :(得分:2)
如果我理解正确,你可以尝试这样的事情:
var myValue = ko.observable();
myValue.attributes = { id: ko.observable() };
然后对myValue.attributes.id
的更改不应该冒出myValue
,因为两者之间有一个不可观察的对象,但我还没有对其进行测试。
修改强>
很抱歉听到这不起作用。我的最后一个想法,这是一个丑陋的黑客,将扼杀可观察的更新。
var myValue = ko.observable();
myValue.id = ko.observable()
.extend({ rateLimit: { timeout: Integer.MAX_VALUE, method: "notifyWhenChangesStop" } });
每次id传输之前等待Integer.MAX_VALUE
ms,然后传播更改,并在该时间发生新的更改时重置。在现实世界的解决方案中,这应该有效地禁用事件传播,但正如我所说,它是一个黑客攻击。也许一个自定义扩展程序的编写方式可以和rateLimit一样,它可以完成所需的操作,但我不知道KO源代码。