我有这个小ViewModel:
function BooksViewModel() {
var self = this;
self.books = ko.observableArray(library);
self.findByLanguage = function(lang) {
self.books = ko.computed(function() {
return ko.utils.arrayFilter(library, function(book) {
return book.language() === lang;
});
});
};
}
findByLanguage方法按语言过滤数组。在视图中,我试着像这样实现:
<ul class="dropdown-menu">
<li><a tabindex="-1" href="#" data-bind="click: findByLanguage('C')">C</a></li>
<li><a tabindex="-1" href="#" data-bind="click: findByLanguage('Cpp')">C++</a></li>
</ul>
我正在尝试通过从那里调用语言参数来重用该函数。但是如果我在data-bind上传递带括号的函数,它会自动被调用。
我该如何做到这一点?
答案 0 :(得分:24)
实现此目的的最简单方法是将其包装在仅在单击时执行的函数中,例如:
<li><a tabindex="-1" href="#" data-bind="click: function () {findByLanguage('C')}">
或者,您可以使用绑定上下文来完成这一操作。
<li><a tabindex="-1" href="#" data-bind="click: findByLanguage.bind('C')">
Here is an example of the click binding using JS Fiddle (http://jsfiddle.net/uFyaP/1/)
答案 1 :(得分:9)
您可能会对稍微不同的方法感兴趣,这些方法会在视图模型中添加额外的字段。
http://jsfiddle.net/jearles/RN9Dw/
通过将languages
添加到视图模型中,您可以使用Knockout呈现菜单,click
绑定将自动传递单击处理函数的语言。此外,添加selectedLanguage
作为observable可以在您选择或清除语言时更改books
计算值。
<ul class="dropdown-menu" data-bind="foreach: languages">
<li><a tabindex="-1" href="#" data-bind="text: $data, click: $root.filterByLanguage"></a></li>
</ul>
<button data-bind="click: showAll">Show All</button>
<div data-bind="foreach: books">
<p><span data-bind="text: name"></span>, <span data-bind="text: language"></span></p>
</div>
function BooksViewModel() {
var self = this;
self.languages = ko.observableArray(['C', 'C++']);
self.selectedLanguage = ko.observable();
self.library = [{name: 'Book A', language: 'C'}, {name: 'Book B', language: 'C++'}];
self.books = ko.computed(function() {
return ko.utils.arrayFilter(self.library, function(book) {
return self.selectedLanguage() == null ||
book.language === self.selectedLanguage();
})
});
self.showAll = function() {
self.selectedLanguage(null);
}
self.filterByLanguage = function(lang) {
self.selectedLanguage(lang);
};
}
ko.applyBindings(new BooksViewModel());
答案 2 :(得分:1)
我知道这个问题已经过时了,但是如果有人感兴趣,根据docs,第一个参数应该是viewModel,然后按预期工作。
<ul class="dropdown-menu">
<li><a tabindex="-1" href="#" data-bind="click: findByLanguage.bind($data, 'C')">C</a></li>
<li><a tabindex="-1" href="#" data-bind="click: findByLanguage.bind($data, 'Cpp')">C++</a></li>
</ul>