【发布时间】:2014-03-28 09:57:19
【问题描述】:
让我们考虑一个像这样使用敲除的视图模型:
var data = [{ id: 1, name: "John Doe" }, { id: 2, name: ""}, { id: 3, name: "Peter Parker"}];
var viewModel = {
items: ko.observableArray(data)
};
viewModel.showName = function (name) {
console.log(this);
return name && name.length > 0;
};
viewModel.removePerson = function () {
console.log(this);
};
ko.applyBindings(viewModel);
有了这个视图:
<ul data-bind="foreach: items">
<li><span data-bind="text: id"></span>
<span data-bind="visible: $root.showName(name)">Yes! show the name</span>
<a href="#" data-bind="click: $root.removePerson">Remove</a>
</li>
</ul>
你可以在这里看到它的实际效果:http://jsfiddle.net/SmW35/8/
在这种情况下,当有人点击“删除”链接时,KO调用了showName函数, 函数里面的对象“this”,就是当前item的对象,比如我点击item 2中的“remove”,“this”就是{id: 2, name: ""} 但是,当 KO 绑定“可见”并调用 showName 函数时,“this”对象不包含当前项,您必须将“name”传递给函数(或者您可以使用 $data)。
所以,我有两个问题:
- 有一种方法可以从视图调用 showName 函数,而无需传递名称或 $data(与删除链接类似的行为)
- 如果没有,这样做有什么问题吗?我与一位同事进行了一次有趣的讨论,他认为这样做是不对的,因为您是从视图 ($root.showName(name)) 发送数据,然后这不是“纯”MVVM 模式。他提议创建一个自定义 KO 绑定来实现该功能。在我看来是用坦克杀死苍蝇,但我很想知道是否有不同的方法,或者你也认为我没有用我的代码做一个纯粹的 MVVM 模式。
【问题讨论】:
-
出于兴趣,为什么要隐藏名称 span 但让按钮可见。如果您想隐藏两者,则 Luis 在下面描述了一个不同的解决方案
-
@RobertSlaney 删除按钮仅用于帮助理解我的要求。我的项目中没有删除按钮,并且 showName 用于其他目的(但完全相同)。谢谢!
标签: javascript mvvm knockout.js