【问题标题】:knockout js Uncaught Error: Cannot write a value to a ko.computed unless you specify a 'write' option.淘汰赛 js 未捕获的错误:除非您指定“写入”选项,否则无法将值写入 ko.computed。
【发布时间】:2014-09-08 15:53:47
【问题描述】:

在我的 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. 

任何解决方案??

【问题讨论】:

  • 你认为self.PopulateBranch = ko.computed(...) 是做什么的?请提供更多代码(例如branchView.Branches的定义,外部PopulateBranch是一个全局函数,你是如何调用PopulateBranch)。
  • 是的,它是全局函数...我会尝试为您提供更多代码
  • jsfiddle.net/sohimohit/43zkoszu/18 这是小提琴链接,我在点击显示分支时调用函数

标签: javascript knockout.js knockout-3.0


【解决方案1】:

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 来计算该经过时间的字符串表示,每当可观察值发生变化时,knout 将自动重新计算该字符串。

【讨论】:

  • 但现在每当我单击 showFields 时,它都会在其中添加字段。第一次是 2 然后是 4 然后是 6
  • 这就是 push 对数组所做的事情...如果要删除数组的旧内容,请在 push 向其中添加新数据之前执行 Branches.removeAll()
  • stackoverflow.com/questions/25905527/… 这是另一个问题 4 u
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 2014-07-26
  • 1970-01-01
  • 2017-03-21
  • 2020-05-03
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多