为什么要添加属性/方法到视图模型AFTER定义
Why add properties/methods to viewmodel AFTER definition?
我使用一个示例项目(durandal541)作为参考,在添加身份验证到我的durandal541为基础的应用程序。在它中,我注意到在大多数页面的视图模型中,程序员已经这样做了:
// Reveal the bindable properties and functions
var vm = {
activate: activate,
goBack: goBack,
title: 'manage',
session: session,
userName: ko.observable(),
logins: ko.observableArray(),
localLoginProvider: ko.observable(),
externalLoginProviders: ko.observableArray(),
message: ko.observable()
};
vm.hasLocalPassword = ko.computed(function () {
var logins = vm.logins();
for (var i = 0; i < logins.length; i++) {
if (logins[i].loginProvider() === vm.localLoginProvider()) {
return true;
}
}
return false;
});
vm.changePassword = ko.computed(function () {
if (!vm.hasLocalPassword()) {
return null;
}
return new ChangePasswordViewModel(vm, vm.userName());
});
...
添加"hasLocalPassword"answers"changePassword"到刚刚定义的"vm"视图模型而不是这样做,它们在定义时作为视图模型的一部分包含在其中的点/好处是什么?:
// Reveal the bindable properties and functions
var vm = {
activate: activate,
goBack: goBack,
title: 'manage',
session: session,
userName: ko.observable(),
logins: ko.observableArray(),
localLoginProvider: ko.observable(),
externalLoginProviders: ko.observableArray(),
message: ko.observable(),
hasLocalPassword = ko.computed(function () {
var logins = vm.logins();
for (var i = 0; i < logins.length; i++) {
if (logins[i].loginProvider() === vm.localLoginProvider()) {
return true;
}
}
return false;
}),
changePassword = ko.computed(function () {
if (!vm.hasLocalPassword()) {
return null;
}
return new ChangePasswordViewModel(vm, vm.userName());
})
};
啊。现在我明白了。正如Ryan Niemayer在10:45解释的那样!http://vimeo.com/51103092
这个问题可能会被删除,但以防任何其他新手想知道-简单的答案是ko.computeds立即被评估(当然,除非您添加了deferred选项),这意味着在这种情况下,任何引用"vm"视图模型的computed在启动时失败,如果在视图模型本身中定义(如我的第二个例子),因为vm在那一刻根本不存在!因此,在初始定义之后,将计算添加到已定义的视图模型对象中,如第一个示例所示。
相关文章:
- 如何在视图模型contet更新更新上调用Jquery函数
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 在MVVM视图模型中处理应用程序范围的元素
- 将c#视图模型转换为javascript模型时转义HTML标记
- 使用knockout.js将数组绑定到视图模型
- 将js对象更改为使用嵌套的可观察数组敲除js视图模型
- 聚合物:在不同的视图模型中多次使用元素
- 使用AMD时未定义淘汰组件视图模型
- 如何在Knockout.js中选中复选框时更新视图模型及其依赖项
- 无法将对象列表从视图模型设置为 javascript 变量
- 挖空视图模型函数仅影响最后一个实例
- 挖空.js嵌套视图模型不起作用
- 为什么我的视图模型不起作用
- 挖空、视图模型位于其他对象和数据绑定中
- 如何将经度/经度值绑定到挖空视图模型方法
- 挖空.js:等待视图模型实例化完成
- 在Knockout视图模型中调用jQuery插件是一种有效的模式
- KnockoutJS:如何避免在applyBindings上运行视图模型函数
- 使用knockoutjs操作视图模型
- Kendo UI自定义验证不适用于模板和视图模型