knockout js Uncaught Error:无法为ko.computed写一个值,除非你指定了一个' write'选项。

时间:2014-09-08 07:27:51

标签: javascript knockout.js knockout-3.0

在我的js中我点击一个函数点击这里是我的功能

 function PopulateBranch(branchAreaName) {

    var nodePath = "/content/eng/phone-numbers/jcr:content/content-page/wireframe";

    $.ajax({
        data:  "action="+"getBranch"+  "&nodePath=" + nodePath +  "&nodeName=" + branchAreaName,
        url: '/bin/branchlocator/crud' , 
        dataType: 'json',
        type: 'GET',
        success: function (data) {

            self.PopulateBranch = ko.computed(function(){
                ko.utils.arrayForEach(data, function(item){
                    branchView.Branches.push(new Branch(item));
                });
            });
        },
        error: function (exception) {
            alert("fail");
        }
    });

};

我在视图模型中调用此函数,但是当我调用此函数时,我收到此错误

Uncaught Error: Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters. 

任何解决方案??

1 个答案:

答案 0 :(得分:2)

function PopulateBranch(branchAreaName) { ... }是代码中的全局函数。当你第一次打电话时,会发生这种情况:

  • 您致电PopulateBranch("someAreaName")

  • 进行AJAX调用。

  • 当AJAX调用成功时,将调用成功处理程序并执行以下代码:self.PopulateBranch = ko.computed(...);。您在范围内没有名为self的变量,因此它会解析为window.self,等于window,也称为全局范围。这意味着这行代码用新的function PopulateBranch(branchAreaName) { ... }处理程序替换旧的ko.computed

  • 下次拨打PopulateBranch("someAreaName")时,您不再呼叫原始PopulateBranch()功能,而是拨打ko.computed版本。

要解决您的问题,您应该删除该self.PopulateBranch = ko.computed(...);行,并将其替换为更新Branches数组的不同代码。也许你只需要这个:

success: function(data) {
    ko.utils.arrayForEach(data, function(item) {
        branchView.Branches.push(new Branch(item));
    });
}

顺便说一下,我认为你误解了ko.computed的使用。 BranchAreaViewModel' s PopulateBranches也不应该是ko.computed,它可以是普通的功能。当您想要根据另一个可观察值计算值时,应使用ko.computed,例如,如果您有一个可观察的跟踪经过时间(以秒为单位),则可以使用ko.computed计算字符串表示形式经过的时间,每当可观察值发生变化时,淘汰赛都会自动重新计算该字符串。