KnockOutJs:为什么click data-bind执行元素的on-load?

时间:2013-10-09 15:23:54

标签: jquery knockout.js

我有一个通过php生成的锚链接,它将被绑定在ko上并且工作正常。我的问题是为什么在元素加载时执行ko函数?下面是生成的代码。

html:

<a data-bind="click: addOrderedProducts(11,"CRM130930001","Cream",0.00,0,0,0)" class="Add" title="Add" href="">Add</a>

ko功能:

self.addOrderedProducts = function (id,product_number,name,price,quantity,discount,balance){
    self.orderedProducts.push(new Product(id,product_number,name,price,quantity,discount,balance));
};

请帮助我......提前致谢:)

3 个答案:

答案 0 :(得分:57)

这就是对象文字在Javascript中的工作方式,因此在创建对象时会立即评估像函数类这样的属性值。

要使其工作,您需要将click绑定中的函数调用包装成匿名函数:

<a data-bind="click: function () { addOrderedProducts( ... ) }" href="">Add</a>

另见文档:Accessing the event object, or passing more parameters

答案 1 :(得分:9)

或者,您可以使用我认为稍微清洁的...click: addOrderedProducts.bind($data,...)(尽管这有点个人品味)。

bindfunction对象的ES5方法(Knockout为非ES5浏览器填充它),它返回一个新的匿名函数,当被调用时,它将获取其上下文(即其{{1}从第一个参数到this,以及传递给bind的任何其他参数的前几个参数。)

BTW(虽然没人在这里做过)​​但值得一提的是,从来没有必要写下这样的东西:

bind

相反,你可以写

functionWithCallback(..., function(data) {
  someOtherFunction(data);
});

函数的名称​​是作为匿名函数表达式的函数引用;没有必要编写后者以获得一个(当然,如果回调涉及的代码多于单个函数调用,则需要一个匿名函数)。

答案 2 :(得分:0)

来自官方documentation

<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">Click me</button>