我遇到了敲除计算的observable和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对象,此代码首先打开observable并创建其Clean Js对象而不是通过Stringify它将创建JSON 。现在我认为在展开observable时,我的计算observable的Age可观察依赖性增加,现在它正在评估用户何时更改Age属性。
如果我的解释是正确的,我该如何避免这种情况?
答案 0 :(得分:2)
问题是“这个”变量。您正在访问计算中的主视图模型。传递引用,当更改时,计算值现在重新计算。
你最好的选择是做这样的事情。
创建一个包含您要传递的数据的局部变量,并将其传递给同步。
这是来自你小提琴的更新的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 });
}