我有一个视图模型,它必须附加到<li>
标记的单击事件。这是视图模型和标记
var viewModel =
{
Folders: ['Inbox', 'Archive', 'Sent', 'Spam'],
SelectedFolder: ko.observable('Inbox'),
chosenFolderId: ko.observable(),
navigate: function () {
self.chosenFolderId(folder);
}
};
ko.applyBindings(viewModel);
标记是
<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>
问题出在这条线上
<a href="#" data-bind="click:navigate">
和
<li data-bind="css:{active: $data == chosenFolderId() }">
上面的两行都没有分别附加到Navigate
函数和chosenFolderId
可观察到的。它说Navigate
是未定义的。无法解析. Same goes for
chosenFolderId`。
知道为什么会这样吗?
您当前的方法存在一些问题:
当您在ul
中使用foreach绑定(例如data-bind="foreach:Folders"
)时,"当前上下文"将是文件夹集合中的项目。
因此,如果你想访问navigate
或chosenFolderId
方法,你需要使用$parent
或$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>
视图模型中也存在一些问题。如果你有像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());
注意:您的navigate
函数需要一个folder
参数才能工作,Knockout将为您传递当前项。
这是一个正在工作的JSFiddle。
如果你想用一个对象文字作为你的视图模型,这里是JSFiddle,它展示了这种方法。
但是,您应该知道双视图模型创建方法的优势和优势。这个SO问题很好地总结了它:声明为对象文字的敲除视图模型与函数之间的差异