DurandalJS和用参数组合子视图

时间:2014-01-15 19:07:14

标签: javascript durandal durandal-2.0

我在从Knockout的模板绑定过渡到Durandal compose绑定时遇到了一些困难。

在我的旧项目中,我有一个选项卡列表,可以通过将它们放入“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)
                ]);

然后,当我想要展示一个时,我会将它放入活动的可观察状态:

self.selectedTabSection(self.tabSections()[0]);

当我更改为compose绑定时,似乎Durandal无法为我的ViewModel找到关联的Views,因为我绑定了模型的实例而不是ViewModel本身的构造函数。换句话说,

self.selectedTabSection(BasicTabViewModel);

找到合适的视图,而

self.selectedTabSection(new BasicTabViewModel(self, db));

没有。

如何让viewLocator理解我正在传递一个实例而不是ViewModel构造函数?如果我不能,我如何将参数传递给我的子视图,因为它们在组成之前尚未初始化?

EDIT / UPDATE:

看起来这与我如何编写我的孩子ViewModel有关。从ViewModel的构造函数返回对象时,Durandal似乎有问题。

这似乎按预期工作:

var viewModel = function (parentVm, db) {
    var self = this;
} 

鉴于此:

var viewModel = function(parentVm, db){
     var self = this;
     //public api
     return {};
}

没有。关于从构造函数返回对象的一些事情使得DurandalJS在尝试定位View时会丢失,并且还会混淆各种范围。我正在考虑重新编写我的脚本以适应,但这种从构造函数返回一个对象的模式对我来说很有用(在Durandal之前)Curious ......

1 个答案:

答案 0 :(得分:2)

这是有用的原因 -

var viewModel = function (parentVm, db) {
    var self = this;
}

然而这不是 -

var viewModel = function(parentVm, db){
     var self = this;
     //public api
     return {};
}

是因为你正在删除你的函数创建对象所做的一切。

考虑一下 -

function newModule (path, params){
     var self = this;
     self.modulePath = path;
     self.activationData = params;
}

现在您可以创建此匿名函数的实例,并将参数传递给您想要将视图/视图模型绑定到。

var theseChildViewModels = ko.observableArray();
var someData = getDataFromSomewhere();
theseViewModels.push(new newModule('viewmodels/myViewModelOne', { data: someData }));
theseViewModels.push(new newModule('viewmodels/myViewModelTwo', { data: someData }));

现在您可以在父视图中绑定到这些 -

<ul data-bind="foreach: theseChildViewModels">
    <li>
        <!-- ko compose: { model: modulePath, activationData: activationData} -->
        <!-- /ko -->
    </li>
</ul>

动态声明您的路径以及在合成期间将哪些数据传递到激活回调。