gpt4 book ai didi

javascript - ko.toJSON 和计算可观察值的问题

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

我对 knockout 计算的可观察值和 toJSON 函数有疑问。我创建了一个Fiddle Example 。在此示例中,我有一个模型:

function VM()
{
this.Name = ko.observable("Tom");
this.Age = ko.observable(23);

//I want this computed evaluate only
//when name will change. So i put Name observable
//inside it.
ko.computed(function(){
this.Name();
//send only after dom is initiallized
if(initialized){
Server.Sync(this);
}
}, this).extend({ throttle: 500 });
}

function Server()
{
}

Server.Sync = function(data)
{
alert("send");
var jsonData = ko.toJSON(data); //This is the problamatic code which..
//increases the computed dependency. After executing this code the..
//computed function is now evaluates on Age also which i do not want.

//send jsonData
};

在此模型中,我希望仅当用户更改 Name observable 属性时才计算计算结果。在执行Server.Sync函数之前它可以正常工作。在 Sync 函数中,我通过 toJSON 函数从 ViewModel 对象创建 JSON 对象,此代码首先打开可观察对象,然后创建其 Clean Js 对象,而不是通过 Stringify它将创建 JSON。现在我认为在展开可观察量期间,我计算的可观察量的年龄可观察依赖性会增加,现在每当用户更改年龄属性时它都会进行评估。

如果我的解释是正确的,我怎样才能避免这种情况?

最佳答案

问题是“this”变量。您正在计算中访问主视图模型。引用被传递,当引用发生变化时,计算值现在会重新计算。

你最好的选择就是做这样的事情。

创建一个局部变量,其中包含要传递的数据并将其传递到同步。

这是您的 fiddle 更新的 JSBin。我从计算中删除了它,并使用局部变量来访问它。

http://jsbin.com/eqejov/9/edit

function VM()
{
var self = this;
self.Name = ko.observable("Tom");
self.Age = ko.observable(23);

var localValue = {
Name: self.Name(),
Age: self.Age()
};

//I want this computed evaluate only
//when name will change. So i put Name observable
//inside it.
ko.computed(function(){
self.Name();
//send only after dom is initiallized
if(initialized){
Server.Sync(localVariable);
}
}).extend({ throttle: 500 });
}

关于javascript - ko.toJSON 和计算可观察值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300303/

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