Knockout.js点击绑定参数

jvi*_*tti 10 knockout.js

我有这个小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; 
            });
        });
    };
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过从那里调用语言参数来重用该函数.但是如果我在数据绑定上传递带括号的函数,它会自动被调用.

我怎么能做到这一点?

Jam*_*rke 24

完成此操作的最简单方法是将其包装在仅在单击时执行的函数中,例如:

<li><a tabindex="-1" href="#" data-bind="click: function () {findByLanguage('C')}">
Run Code Online (Sandbox Code Playgroud)

或者,你可以使用绑定上下文应该做的伎俩.

<li><a tabindex="-1" href="#" data-bind="click: findByLanguage.bind('C')">
Run Code Online (Sandbox Code Playgroud)

以下是使用JS Fiddle(http://jsfiddle.net/uFyaP/1/)进行点击绑定的示例

  • 上面的JSFiddle示例没有.bind场景.看看这个http://jsfiddle.net/Ly2v90mn/ (2认同)

Joh*_*les 9

您可能会对稍微不同的方法感兴趣,这些方法会在View模型中添加额外的字段.

http://jsfiddle.net/jearles/RN9Dw/

通过添加languages到视图模型中,您可以使用Knockout呈现菜单,click绑定将自动传递单击到处理函数的语言.此外,添加selectedLanguage为observable可以在books选择或清除语言时更改计算值.

HTML

<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>?
Run Code Online (Sandbox Code Playgroud)

JS

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());
Run Code Online (Sandbox Code Playgroud)