【问题标题】:Knockout - Click Binding to Object Function - Scope Issues淘汰赛 - 单击绑定到对象函数 - 范围问题
【发布时间】:2013-11-16 09:30:57
【问题描述】:

我有一个简单的字符串集合,我想使用 Knockout 的 foreach 绑定为其创建按钮。该按钮使用单击绑定在我的对象中加载一些数据。绑定正确发生,但实际加载功能失败,告诉我不支持方法。

这是我所拥有的:

//My Object
function MyObject()
{
    this.WorkerFunction = function(id)
    {
        //Do Work
    }

    this.Load = function(id)
    {
        //Call Another Function
        this.WorkerFunction(id); //Error: Object doesn't support property or method 'WokerFunction'
    }
}

//Creation
var myObject = new MyObject();

//VM Binding
var vm = ko.mapping.fromJS(jQueryAjaxObject);
ko.applyBindings(vm);

//HTML
<div data-bind="foreach: stringIDCollection">
    <button data-bind="click: function() { myObject.Load($data) }"> Load </button>
</div>

单击按钮时,出现以下错误:Object doesn't support property or method 'WokerFunction'。我的代码中其他地方的鼠标移动事件也出现了类似的错误,但我能够使用下面的绑定函数解决这个问题。但是,我无法让它适用于 Knockout 绑定。​​

$("myElement").mousemove(this.MouseMove.bind(this)); 

编辑

我也试过var self = this;self.WorkerFunction(id);,但我得到了相同的结果;不支持该方法。


问:在保持 this 范围的同时,处理 Knockout Click 绑定到对象函数的正确方法是什么?


【问题讨论】:

    标签: javascript jquery knockout.js


    【解决方案1】:

    这可能是由于您绑定事件处理程序的方式。有多种方法可以做到这一点,每种方法都有其细微差别,请参阅此处的官方文档:http://knockoutjs.com/documentation/click-binding.html 和上下文 wrt this 此处:https://dzone.com/articles/knockout-click-binding-and

    【讨论】:

      【解决方案2】:

      您必须存储对this 的引用。

      了解how the this keyword works in JavaScript.

      // converted to commonly accepted coding style
      function ViewModel() {
          var self = this;
      
          this.workerFunction = function(id) {
              //Do Work
          };
      
          self.load = function(id) {
              self.workerFunction(id);
          };
      
          // do initialization here...
          self.stringIDCollection = ko.mapping.fromJS(/*...*/);
      }
      
      ko.applyBindings(new ViewModel());
      

      除此之外:不要在绑定中使用 JavaScript 代码。 (尤其不是整个函数。永远不会。)这正是淘汰赛旨在避免的事情。

      load 设为视图模型的方法,如上所示

      <div data-bind="foreach: stringIDCollection">
          <button data-bind="click: $root.load">Load</button>
      </div>
      

      【讨论】:

      • 嘿托马拉克。谢谢回复。我也尝试过使用 self = this 并且得到了完全相同的结果;该方法不受支持。
      • 查看我的“除此之外”。您不应该在绑定中使用 JavaScript 代码。
      • 您建议的 ViewModel 不适用于我的情况。 Knockout ViewModel 由 C# 服务器生成并由 jQuery 检索,它返回一个大而复杂的 Javascript 对象给我;这就是我使用映射的原因。带有 Load 函数的 myObject 对象是一个完全独立的对象,它进行 WebGL 渲染;唯一的通信点是 ViewModel 告诉 WebGL 对象要渲染什么场景 ID。因此,将我所有的渲染代码都带入我的服务器生成的 ViewModel 是不可能的。
      • 我明白了。这就是custom bindings 发挥作用的地方。例如,编写一个名为render 的绑定,并在那里调用myObject。您仍然不应该 a) 在 data-bind 属性中编写代码或 b) 创建从视图模型到视图的任何类型的依赖关系。
      • “您不应该在绑定中使用 JavaScript 代码”——相反,文档专门提供了这方面的示例以及您可能想要这样做的原因:@ 987654323@。这些文档还应该帮助任何在 13 年遇到 op 问题的人。
      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 2013-03-06
      相关资源
      最近更新 更多