Knockout.js:从模型中分离ViewModel逻辑
Knockout.js: Separating ViewModel logic from the Model
在Knockout.js主页上的一个视频教程中,演示者设置了一个简单的示例,其中ViewModel包含一个observableArray
属性,其中包含一个自定义对象(在本例中是一个"friend"对象)的实例:
function friend(name) {
return {
name: ko.observable(name),
remove: function () {
viewModel.friends.remove(this);
}
};
}
var viewModel = {
friends: ko.observableArray()
}
ko.applyBindings(viewModel);
然后使用KO模板呈现:
<script id="friendsTemplate" type="text/html">
<li>
<input data-bind="value: name" />
<button data-bind="click: remove">Remove</button>
</li>
</script>
对我来说似乎很奇怪,从ViewModel的friends
集合中删除friend
对象(模型?)的逻辑是在friend
对象本身实现的。这不会在friend
对象和ViewModel实例之间创建一个不希望的耦合吗?是否有一个更一致的设计方法,将允许removeFriend
功能被定义在ViewModel,而不是在friend
对象?
更常见的模式是将removeFriend
函数放在更高的级别,并使用:
<button data-bind="click: $parent.removeFriend">Remove</button>
当Knockout从click
或event
绑定调用处理程序时,它将传递当前数据项作为第一个参数。它还将上下文(this
)设置为等于当前数据。根据您的结构,您可能需要bind
函数以确保在适当的上下文中调用它,或者使用var self = this;
之类的策略。
因为viewModel
是一个对象字面值,在这种情况下removeFriend
看起来像:
friends: ko.observableArray(),
removeFriend: function(friend) {
viewModel.friends.remove(friend);
}
相关文章:
- 如何附着分离的对象
- 如何使用jQuery each分离字符串中的元素
- 将JavaScript函数与HTML分离
- 将Javascript与HTML分离
- 如何定义一个模块并使用它来分离js文件
- 从AJAX回调函数中分离数据
- 在Jquery中分离后,如何将相同的函数添加回代码中
- 使用谷歌地图api 3为MapTypeId.TERRAIN分离按钮
- 将JS分离为多个文件
- '范围.分离'注入环回角度sdk时出错
- 如何在我传递给视图的ViewModel集合中获得jQuery可选对象的值,以作为有序列表进行迭代
- 在Knockout中进行ajax调用后,ViewModel不会更新
- 如何使用javascript将门牌号从完整地址中分离出来
- 如何使用ngModel将自定义控件的提供程序扩展器分离到Angular 2中的单独文件中
- 从主体分离时,jQuery对象scrollTop(值)
- AngularJS中的代码分离
- 将 DOM 操作与 Angular 控制器分离 - 需要最佳实践
- 针对不同环境分离谷歌分析
- Knockout.js:从模型中分离ViewModel逻辑
- JavaScript-Model和ViewModel的客户端分离