25

我有一个通过 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));
};

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

4

3 回答 3

62

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

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

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

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

于 2013-10-09T15:26:29.280 回答
9

或者,您可以使用...click: addOrderedProducts.bind($data,...)我认为稍微干净的(尽管这有点个人喜好问题)。

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

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

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

相反,你可以写

functionWithCallback(..., someOtherFunction);

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

于 2013-10-09T16:16:19.370 回答
0

来自官方文档

<button data-bind="click: myFunction.bind($data, 'param1', 'param2')">Click me</button>
于 2018-09-21T12:48:40.407 回答