我想知道在绑定时是否有可能使用knockoutjs来传递参数 .
我绑定了一个复选框列表,并希望绑定到我的viewmodel中的单个计算observable . 在我的viewmodel中(基于传递给read函数的参数)我想根据某些条件返回true / false .
var myViewModel=function(){
this.myprop=ko.computed({read: function(){
//would like to receive an argument here to do my logic and return based on argument.
}
});
};
<input type="checkbox" data-bind="checked: myprop(someval1)" />
<input type="checkbox" data-bind="checked: myprop(someval2)" />
<input type="checkbox" data-bind="checked: myprop(someval3)" />
有什么建议?
4 回答
创建一个函数,其唯一目的是返回计算的observable . 它可以根据需要采用参数 . 如果你想要它是一个双向绑定,它必须是一个单独的计算observable .
然后在绑定中,使用适当的参数调用该函数 . 它返回的计算的observable将绑定到您的视图中并将照常更新 .
这是a fiddle,我使用这种技术来创建事件处理程序 . 你可以在这里做类似的事情 .
您可以通过将函数作为observable上的方法来保持其清洁 . 通过添加到
ko.observable.fn
原型或将其直接添加到可观察实例 .然后申请你的观点
Demo
但是,如果您只是尝试将所有这些复选框绑定到视图模型中的单个值,则无需执行此操作 . 在视图模型中对数组使用
checked
绑定,并为复选框指定值 . 每个选中的值都将添加到数组中 . 这将是一种双向约束 .Demo
接受的答案是不错的,但是如果你有一个为每个复选框生成一个ko.computed的函数,你会在多个匿名计算的observables中增加不必要的开销,当你的复选框列表超过4-5个选项时,这会快速增加 .
这是按位方案的更简单的实现,但计算的函数可以是任何需要的 .
脚本:
示例小提琴:http://jsfiddle.net/i_vargas3/RYQgg/
没有理由使用
computed
值 . 只需在View Model中定义一个函数,然后将checked
绑定到它 .下面是一个非常简单的例子 .
HTML
JS
尽管如此,尝试尽可能多地将逻辑推入View模型是个好主意 . 建议创建一个View复制模型,将复选框建模为一个对象,然后关于是否应该选中复选框的逻辑可以封装在里面 .
编辑:根据要求进行双向绑定,我编写了一个扩展器来管理一个可观察的 .
http://jsfiddle.net/jearles/j6zLW/5/
在不知道具体细节的情况下,你应该做的就是定义一个ko.observableArray或者计算出的数组值
HTML:
JS:
并且不从标记传递值来定义模型状态