javascript - 除非指定 'write' 选项,否则会计算 knockout js 未捕获错误 : Cannot write a value to a ko.。

标签 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");
        }
    });

};

我在 View 模型中调用此函数,但当我调用此函数时出现此错误

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. 

有什么解决办法吗??

最佳答案

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 的用法。 BranchAreaViewModelPopulateBranches不应该是ko.computed也可以是普通函数。 ko.computed当您想要基于另一个可观察值计算一个值时,应该使用该值,例如,如果您有一个以秒为单位的可观察跟踪耗时,则可以使用 ko.computed为了计算所用时间的字符串表示形式,每当可观察值发生变化时,knockout 都会自动重新计算该字符串。

关于javascript - 除非指定 'write' 选项,否则会计算 knockout js 未捕获错误 : Cannot write a value to a ko.。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719274/

相关文章:

javascript - 我如何使用javascript或dojo从链接或按钮实现 'copy url to clipboard'而不使用flash

javascript - 当变量是函数参数时,应用程序抛出变量引用错误

javascript - 如何使 Knockout.js 组件附加到页面而不删除/覆盖任何旧绑定(bind)?

javascript - 如何在 JavaScript 中创建自定义、动态、基于反射的 ViewModel 验证?

c# - ASP.NET MVC 5 模块化 Web 应用程序架构?

javascript - npm 多模块和主入口点

php - 产品的 Javascript 图片框

javascript - 以为我了解 Knockout.js,现在我不太确定

javascript - knockout 模型 : Challenge in Knockout Checkbox

knockout.js - KnockoutJS : computed vs. 纯计算