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. 

任何解决方案?

4

1 回答 1

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. ' BranchAreaViewModelsPopulateBranches不应该是一个ko.computed,它可以是一个普通的函数。ko.computed当您想根据另一个可观察值计算值时应该使用,例如,如果您有一个可观察的跟踪经过时间(以秒为单位),您可以使用 ako.computed来计算该经过时间的字符串表示,淘汰赛将自动重新计算该字符串每当可观察值发生变化时。

于 2014-09-08T07:53:47.467 回答