Javascript Durandal尝试从viewmodel文件夹访问视图
我有一个compose绑定,当durandal试图查找视图时,它会在Javascript Durandal尝试从viewmodel文件夹访问视图,javascript,knockout.js,durandal,Javascript,Knockout.js,Durandal,我有一个compose绑定,当durandal试图查找视图时,它会在app/viewmodels下查找,而不是app/views VM看起来像这样 define(["fields/fieldClosures"], function (fields) { var ctor = function(opt) { this.value = opt.value; }; return fields.readonly.default = ctor; }); 使用组合
app/viewmodels
下查找,而不是app/views
VM看起来像这样
define(["fields/fieldClosures"], function (fields) {
var ctor = function(opt) {
this.value = opt.value;
};
return fields.readonly.default = ctor;
});
使用组合绑定的视图
<div data-name="fields">
<div data-bind="css: { 'has-error': hasError }" class="form-group">
<label data-name="label" data-bind="attr: { 'for': id }" class="col-lg-3 control-label"></label>
<div data-name="field" class="col-lg-9"></div>
</div>
</div>
viewLocator的useConvention已启用,其他视图正在工作,仅此视图无法正确加载。它不适用于以上述方式加载的任何视图
requirejs.config({
paths: {
'text': '../Scripts/text',
'durandal': '../Scripts/durandal',
'plugins': '../Scripts/durandal/plugins',
'transitions': '../Scripts/durandal/transitions',
"fields": "viewmodels/form/fields"
}
});
您是否在
viewLocator
上启用了useConvention
?如果不是,默认情况下durandal将在与viewModel相同的路径上查找视图。下面是执行翻译的视图定位器
中的代码:
convertModuleIdToViewId: function(moduleId) {
return moduleId;
}
如果您将viewLocator
告知useconction
,它将强制您所指的视图/视图模型设置。以下是相关的源代码(为简洁起见进行了裁剪):
另一种方法是使用您自己的convertModuleIdToViewId
实现配置视图定位器,并在应用程序生命周期的早期(例如,在应用程序入口点)将其连接起来:
希望这会有所帮助。展示一个使用标准compose绑定的简短示例,并告诉我们您展示的VM的模块ID是什么。
您使用moduel ID是什么意思?您展示的viewmodel的文件名。另外,字段
设置为什么(该语法表示它是一个可观察对象,应该包含VM的模块ID或视图名称)?它基于初学者工具包,因此是的,它已打开,并且它适用于所有其他VM/视图。只是这个视图不起作用。视图的完整路径真的是字段/readonly/number
?Durandal正在寻找路径中的视图模型
,该路径将被视图
替代。如果您在require中设置了某种别名(我怀疑您是根据模块导入设置的),则Durandal将无法解析模块id的viewModel
部分。请尝试通过convertModuleIdToViewId
方法进行调试,您应该能够看到问题所在。
convertModuleIdToViewId: function(moduleId) {
return moduleId;
}
useConvention: function(modulesPath, viewsPath, areasPath) {
modulesPath = modulesPath || 'viewmodels';
viewsPath = viewsPath || 'views';
var reg = new RegExp(escape(modulesPath), 'gi');
this.convertModuleIdToViewId = function (moduleId) {
return moduleId.replace(reg, viewsPath);
};
}
var configureViewLocator = function () {
var viewModelsRegex = /viewmodels/gi;
viewLocator.convertModuleIdToViewId = function (moduleId) {
return moduleId.replace(viewModelsRegex, "views");
};
};