敲击绑定未定义为单击

Joy*_*Joy 6 knockout.js

我有一个视图模型必须附加到<li>标记的单击事件.这是viewmodel和标记

  var viewModel =
    {
        Folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
        SelectedFolder: ko.observable('Inbox'),
        chosenFolderId: ko.observable(),
        navigate: function () {
            self.chosenFolderId(folder);               
        }
    };
ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)

标记是

   <ul class="nav nav-list bs-docs-sidenav affix" data-bind="foreach:Folders">
                @*<li data-bind="css:{active: $data == chosenFolderId() }">*@
                <li>
                    <a href="#" data-bind="click:navigate">                      
                        <!-- ko text: $data -->
                        <!-- /ko -->
                        <i class="icon-chevron-right"></i>
                    </a>
                </li>                   
            </ul>
Run Code Online (Sandbox Code Playgroud)

问题出在这一行

<a href="#" data-bind="click:navigate"> 
Run Code Online (Sandbox Code Playgroud)

<li data-bind="css:{active: $data == chosenFolderId() }">
Run Code Online (Sandbox Code Playgroud)

上述两行都没有分别附加到Navigate函数和chosenFolderIdobservable.它说Navigate是未定义的.它无法解析为. Same goes forselectedFolderId`.

知道为什么会这样吗?

nem*_*esv 12

您当前的方法有一些问题:

当您使用foreach绑定时,例如data-bind="foreach:Folders"ul"currect context"中,将是文件夹集合中的项目.

因此,如果您想要访问navigatechosenFolderId需要使用的方法$parent,或$root访问"root"视图模型(您可以阅读有关绑定上下文的更多信息):

<ul class="nav nav-list bs-docs-sidenav affix" data-bind="foreach:Folders">
    <li data-bind="css:{active: $data == $parent.chosenFolderId() }">
        <a href="#" data-bind="click: $parent.navigate">                      
            <!-- ko text: $data -->
            <!-- /ko -->
            <i class="icon-chevron-right"></i>
        </a>
    </li>                   
</ul>?
Run Code Online (Sandbox Code Playgroud)

您的视图模型中也存在一些问题.如果您有navigate尝试使用的复杂函数,self则应使用函数作为视图模型而不是可以存储的对象文字this:

var viewModel = function() {
    var self = this;
    self.Folders = ['Inbox', 'Archive', 'Sent', 'Spam'];
    self.SelectedFolder = ko.observable('Inbox');
    self.chosenFolderId = ko.observable();
    self.navigate = function(folder) {
        self.chosenFolderId(folder);
    }
};
ko.applyBindings(new viewModel());?
Run Code Online (Sandbox Code Playgroud)

请注意:您的navigate函数需要一个folder参数才能使其工作,Knockout将为您传递当前项.

这是一个有效的JSFiddle.

如果你想用一个对象文字作为你的视图模型,这里是JSFiddle,它演示了这种方法.

但是,您应该知道两种视图模型创建方法的强度和周长.这个SO问题总结得很好:淘汰视图模型之间的区别被声明为对象文字与函数