我相信valueHasMutated()
当应用于任何observable或observableArray时,我会相信刷新/重新检查。在技术方面,它通知订户他们应该重新评估。
Viewmodel:
var testing =function (){
var self=this;
self.status = ko.observable(1);
self.mainobseravle=ko.observableArray();
function subtest()
{
var self=this;
self.controlenable = ko.observable("");
self.statuschange = ko.computed(function(){
//Here i have to use `self.status` how can i use it below. #1
//if(self.status == 1 || self.status==4)
{return true;} else {return false;}
});
}
}
我的视图绑定基于mainobservable
,具有subtest
函数的对象。
调用Ajax
$.ajax({
//under success function
var d = new subtest();
d.controlenable(data.status);
self.mainobseravle.push(d);
});
查看结构:
<table data-bind="foreach:mainobseravle">
<tr><td> <input type="text" data-bind="enable:$data.controlenable" /> </td></tr>
</table>
<input type="button" value="forward" data-bind="click:$root.forward"/>
按钮点击:
self.forward = function(){
// i change the status here
self.status(2);
self.mainobseravle.valueHasMutated(); // this goes fine and my controls still enabled #2
}
让我把事情变得更清楚了,因为我将self.status()
存储在一个可变的并使用了subtest
内部函数并做了所有事情,我希望有一个奇迹,即valueHasMutated
有效,但没有任何作用。
作为范围问题,我无法在self.status()
函数中直接使用subtest
。如果你尝试它会抛出未定义的错误,这就是为什么我在这里使用变量和替代?
如果我遗漏任何重要信息,请提出建议。
答案 0 :(得分:1)
您正在使用var self = this;
。这种(通常是使用不当的)练习的想法是你存储你的上下文(this
指向的内容),这样你就可以在创建自己的闭包的函数中使用它。这样就可以满足您的需求,但是您错误地在self
函数中重新定义了subtest
。试试这个:
var testing = function () {
var self = this;
self.status = ko.observable(1);
self.mainobservable = ko.observableArray();
self.forward = function () {
self.status(2);
};
function subtest()
{
// removed var self = this;
this.controlenable = ko.observable("");
this.statuschange = ko.computed(function () {
// This should now work, because 'self' points to 'testing' and not 'subtest'
// I also made the code a bit shorter but it does exactly the same as your original code
return (self.status == 1 || self.status == 4);
});
this.pushMeToMainObservable = function () {
self.mainobservable.push(this);
};
}
}
Ajax电话:
$.ajax({
//under success function
var d = new subtest();
d.controlenable(data.status);
d.pushMeToMainObservable ();
});
我没有真正理解你的问题,但这应该对你有所帮助。如果修复了范围问题,如果其他一切正常,您就不应该valueHasMutated
。
为了记录,你的设计都错了。将subtest
嵌套在testing
内,然后将subtest
的实例推送到testing
内的可观察数组... ouch ...如果你有一个更模块化的结构,你会这些范围问题较少。我不能在这里详细介绍,因为你已经抽象了#39;您的对象的名称,我不知道您正在尝试构建的是什么大图。但是subtest
和testing
现在的联系太紧密了。它们的功能完全混淆了。