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

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

HTML:

Add 

kofunction:

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

请帮帮我…在此先感谢:)

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

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

 Add 

另请参阅文档: 访问事件对象或传递更多参数

或者,您可以使用...click: addOrderedProducts.bind($data,...)我觉得它稍微清洁一点(虽然这有点个人品味)。

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

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

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

相反,你可以写

 functionWithCallback(..., someOtherFunction); 

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

来自官方文件 :