更改observable的observable属性会导致触发父对象的订阅

时间:2014-09-08 12:58:01

标签: javascript knockout.js subscription observable

我有一个可观察的,比如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无法观察到解决问题吗?我还没检查过

1 个答案:

答案 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源代码。