【问题标题】:Unable to parse bindings knockout error无法解析绑定敲除错误
【发布时间】:2013-02-06 00:11:06
【问题描述】:

我正在处理淘汰赛,但遇到了一个我不知道如何解决的问题。我从 asp.net mvc 控制器中检索了一个 json 对象。我将它传递给以下函数:

load = function (data) {
        var myViewModel = function () {
            var self = this;

            ko.mapping.fromJS(data, self);

            self.hasItems = ko.computed(function () {
                return self.NumberOfItems > 0;
            }, self);

        };
        ko.applyBindings(myViewModel, window.document.getElementById("my-container"));
    }

我正在根据 json 中返回的内容向我的模型对象添加自定义行为,特别是 json 的 NumberOfItems 属性。我的标记是:

 <div class="content" style="display: none;" data-bind="visible: hasItems === false">
    <span class="empty">My Items</span>
</div>

但我不断收到此错误:

错误:无法解析绑定。 消息:ReferenceError:hasItems 未定义; 绑定值:可见:hasItems === false

我不知道为什么 - 我是这方面的新手,非常感谢任何帮助?

【问题讨论】:

    标签: asp.net-mvc knockout.js knockout-mapping-plugin knockout-2.0


    【解决方案1】:

    applyBindings 需要一个对象。试试

    ko.applyBindings(new myViewModel(), window.document.getElementById("my-container"));
    

    此外,当您想要获取 observable 的值时,您需要使用括号。

    return self.NumberOfItems() > 0;
    

    http://jsfiddle.net/36xtR/

    【讨论】:

      【解决方案2】:

      除了 ckal 答案之外,您可能还想以这种方式使用 ko.mappings:

      ko.mapping.fromJS(data, {}, self);  
      

      【讨论】:

      • 谢谢 - 有什么区别?
      • 第二个参数是自定义映射,如果你想指定更新目标,你需要将它作为第三个参数传递 - 请看这里:knockoutjs.com/documentation/plugins-mapping.html in a section "Specifying the update target"
      【解决方案3】:

      您看到的错误“无法解析绑定”意味着淘汰赛找不到您尝试绑定的内容 (hasItems)。

      我认为这是因为您只是在调用 load 函数时创建 viewModel,但在解析绑定时 viewModel 不存在,所以它会报错。

      我会尝试像这样设置您的 viewModel:

      var myViewModel = function () {
              var self = this;
      
              self.load = function (data) {
                  ko.mapping.fromJS(data, self);
              }
      
              self.hasItems = ko.computed(function () {
                  return self.NumberOfItems > 0;
              }, self);
      
          };
      ko.applyBindings(new myViewModel(), window.document.getElementById("my-container"));
      

      然后您可以在 viewModel 中调用加载函数来代替您当前调用加载函数的位置。

      【讨论】:

      • 传递给 applyBindings 时是否需要创建 myViewModel 的新实例,例如。新的 myViewModel()?
      • 是的,请检查 ckal 答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2015-12-06
      • 2015-11-14
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多