我正在使用示例项目(durandal541)作为参考,为我的基于durandal的应用程序添加身份验证。在其中我注意到在大多数页面的viewmodel中,程序员已经这样做了:
// 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”和“changePassword”添加到刚刚定义的“vm”视图模型而不是这样做有什么意义/好处,它们在定义时作为viewmodel的一部分包含在内?:
// 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());
})
};
答案 0 :(得分:2)
阿。现在我明白了。正如Ryan Niemayer在本视频中的10:45所解释的那样! http://vimeo.com/51103092
这个问题可能会被删除,但以防万一其他新手想知道 - 简单的答案是ko.computeds立即被评估 (除非你当然加入延迟选项)和这意味着在这种情况下,任何引用“vm”视图模型的计算机在启动时都会失败,如果在viewmodel本身中定义的(根据我的第二个例子),因为vm在那一刻根本就不存在!因此,如第一个示例所示,在初始定义之后将计算结果添加到定义的视图模型对象。