Javascript Durandal尝试从viewmodel文件夹访问视图

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; }); 使用组合

我有一个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;
});
使用组合绑定的视图

<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

    更新

    字段是在开始执行时添加的路径

    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");
        };
    };