我在从 Knockout 的模板绑定过渡到 Durandal 组合绑定时遇到了一些困难。
在我的旧项目中,我有一个选项卡列表,可以通过将它们放入可观察的“selectedTabSection”中来交换到中心舞台。templateId 是子视图的一个属性。所以在我的父视图中,我创建了我的子模型的实例,如下所示:
self.tabSections([
new BasicTabViewModel(self, db),
new BiometricTabViewModel(self, db),
new ActivityTabViewModel(self, db),
new SurveyTabViewModel(self, db),
new CommunicationTabViewModel(self, db),
new ReferralTabViewModel(self, db),
new GoalTabViewModel(self, db),
new NcpTabViewModel(self, db),
new CriticalValuesViewModel(self, db),
new ConditionManagement(self, db)
]);
然后,当我想展示一个时,我会将其放入活动的 observable 中:
self.selectedTabSection(self.tabSections()[0]);
当我更改为 compose 绑定时,似乎 Durandal 找不到我的 ViewModel 的关联视图,因为我正在绑定模型的实例而不是 ViewModel 本身的构造函数。换句话说,
self.selectedTabSection(BasicTabViewModel);
找到合适的视图,而
self.selectedTabSection(new BasicTabViewModel(self, db));
才不是。
如何让 viewLocator 了解我正在传递一个实例而不是 ViewModel 构造函数本身?如果我不能,我如何将参数传递给我的子视图,因为它们在组合之前还没有被初始化?
编辑/更新:
看起来这与我如何组成我的孩子 ViewModels 有关。当您从 ViewModel 的构造函数返回对象时,Durandal 似乎有问题。
这似乎按预期工作:
var viewModel = function (parentVm, db) {
var self = this;
}
而这:
var viewModel = function(parentVm, db){
var self = this;
//public api
return {};
}
才不是。关于从构造函数返回对象的一些事情会使 DurandalJS 在尝试定位 View 时迷失方向,并且还会弄乱各种范围。我正在考虑重新编写我的脚本以适应,但是这种从构造函数返回对象的模式对我来说很好(在 Durandal 之前)很好奇......