valueHasMutated没有按预期工作?

时间:2014-10-01 07:09:35

标签: html knockout.js

我相信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。如果你尝试它会抛出未定义的错误,这就是为什么我在这里使用变量和替代?

如果我遗漏任何重要信息,请提出建议。

1 个答案:

答案 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;您的对象的名称,我不知道您正在尝试构建的是什么大图。但是subtesttesting现在的联系太紧密了。它们的功能完全混淆了。