小部件视图不能像使用普通视图一样轻松切换,area
因为它们始终是 type partial
。
为了改变它们,你很可能必须覆盖widget.convertKindToModulePath
和widget.convertKindToViewPath
这是来自https://github.com/BlueSpire/Durandal/issues/217的示例
var oldConvert = widget.convertKindToModulePath;
widget.convertKindToModulePath: function(kind) {
if (typeof(kind) == 'function') {
return widget.mapKindToModuleId(kind());
}
return oldConvert(kind);
}
更新
小部件可以通过使用例如 observables 或计算来构造,例如在您的视图中:
<!-- ko widget: getWidgetSettings() -->
<!-- /ko -->
getWidgetSettings
可能是一个ko.computed
(取决于状态)而不是{kind: 'workitem'}
返回类似{kind: { id : 'workitem', status: 'statusId'}}
.
现在您需要进行相应的调整widget.convertKindToModulePath
,widget.convertKindToViewPath
因为 OOTB Durandal 期望 kind 是类型string
,但现在它是object
.
以下内容应该可以帮助您入门:
var oldconvertKindToModulePath = widget.convertKindToModulePath;
widget.convertKindToModulePath = function( kind ) {
if ( typeof(kind) == 'object' ) {
return 'widgets/' + kind.id + '/viewmodel';
}
return oldconvertKindToModulePath(kind);
};
var oldconvertKindToViewPath = widget.convertKindToViewPath;
widget.convertKindToViewPath = function( kind ) {
if ( typeof(kind) == 'object' ) {
return 'widgets/' + kind.id + '/' + statusViewMap[statusId] ;
}
return oldconvertKindToViewPath(kind);
};
作为将其实现为小部件的替代方法,您可以考虑将其实现为标准模块并利用该getView
方法。这是一个例子
http://dfiddle.github.io/dFiddle-2.0/#view-composition/getView
define(['knockout'], function(ko) {
var roles = ['default', 'role1', 'role2'];
var role = ko.observable('default');
var getView = ko.computed(function(){
var roleViewMap = {
'default': 'viewComposition/getView/index.html',
role1: 'viewComposition/getView/role1.html',
role2: 'viewComposition/getView/role2.html'
};
this.role = (role() || 'default');
return roleViewMap[this.role];
});
return {
showCodeUrl: true,
roles: roles,
role: role,
getView: getView,
propertyOne: 'This is a databound property from the root context.',
propertyTwo: 'This property demonstrates that binding contexts flow through composed views.'
};
});
该示例使用单例,它不能满足具有多个独立工作项的要求,因此您必须使用构造函数模式重写它。
随意分叉,我正在接受拉取请求:)。