gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:00:56 26 4
gpt4 key购买 nike

我有一个可观察的值,比如 myValue。这个 observable 有一些属性,比如 id,也是 observable。我定义了一个自定义绑定(bind)来处理 myValue 更改。当我更改可观察属性 id 的值时,会触发 myValue 的自定义绑定(bind)。这是非常不可取的,因为我的自定义绑定(bind)中的更新功能非常昂贵,而且我遇到了性能问题。有没有办法防止父可观察对象与其未更新的子对象一起更新?

代码核心部分

 //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 不可观察可以解决问题吗?我还没查过

最佳答案

如果我理解正确的话,你可以尝试这样的事情:

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 毫秒,然后再传播更改,并在出现新更改时重置。在现实世界的解决方案中,这应该有效地禁用事件传播,但正如我所说,这是一种黑客行为。也许可以用与rateLimit扩展器大致相同的方式编写自定义扩展器来完成所需的操作,但我不知道KO来源。

关于javascript - 更改 observable 的 observable 属性会导致触发父对象的订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25724849/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com