2014-02-09 61 views
1

訪問視圖我有一個撰寫結合,當迪朗達爾試圖找到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> 

data-name="field"被轉換爲數據綁定=「組成:字段」由配置約定庫˚F或KO。如果我用的是標準的撰寫直接結合我得到相同的結果

更新: 路徑VM \軟件\的ViewModels \形式\ \域只讀\ text.js

場是抱着參考成員到VM

這是保持字段構件

define(["fields/fieldClosures", 
    "fields/readonly/text", //Need to find a better way to load all view models with requirejs without specifying them all here 
    "fields/readonly/date", 
    "fields/readonly/number"], function (fields) { 
    function factory(closure, opt) { 
     for (var index in closure) { 
      var model = closure[index]; 
      if (model.can && model.can(opt == null ? null : ko.unwrap(opt.value))) { 
       return model; 
      } 
     } 

     return closure.default; 
    } 

    var id = 0; 
    var ctor = function(label, value, canEdit, options) { 
     this.id = "control-" + id++; 
     this.label = label; 
     var opt = { value: value, label: label, options: options }; 
     var closure = canEdit ? fields.editors : fields.readonly; 
     var model = factory(closure, opt); 

     this.field = new model(opt); 

     this.field.id = this.id; 
     this.hasError = canEdit ? ko.computed(this.getHasError, this) : null; 
    }; 

    ctor.prototype = { 
     getHasError: function() { 
      return this.field.value.isValid && !this.field.value.isValid(); 
     } 
    }; 

    return ctor; 
}); 

useConvention被接通爲VIE的VM wLocator和其他視圖正在工作,它只是這個視圖,不會正確加載。那麼它不會爲被以上述方式加載任何意見工作

  1. 「田/只讀/文本」
  2. 「田/只讀/日期」
  3. 「田/只讀/號」

的參考與工廠創建,但contructors與正常人一樣

更新requirejs注入

領域中的路徑添加在開始做

requirejs.config({ 
    paths: { 
     'text': '../Scripts/text', 
     'durandal': '../Scripts/durandal', 
     'plugins': '../Scripts/durandal/plugins', 
     'transitions': '../Scripts/durandal/transitions', 
     "fields": "viewmodels/form/fields" 
    } 
}); 
+0

顯示使用標準組合綁定的簡短示例,並告訴我們您展示的虛擬機的模塊ID是什麼。 – ebohlman

+0

'

'你是什麼意思與模塊ID? – Anders

+0

您顯示的視圖模型的文件名。此外,什麼'field'設置爲(該語法表明它是一個可觀察的,應該保持虛擬機的模塊ID或視圖名稱)? – ebohlman

回答

2

你有沒有在viewLocator啓用useConvention?如果沒有,默認情況下,durandal將在與viewModel相同的路徑上查找視圖。下面是從做翻譯的viewLocator代碼:

convertModuleIdToViewId: function(moduleId) { 
    return moduleId; 
} 

如果你告訴viewLocatoruseConvention它會迫使你在引用視圖/的ViewModels設置。下面是相關的源代碼(修剪爲簡潔起見):

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

另一種方法是用自己的執行convertModuleIdToViewId配置視圖定位器,並在應用程序的生命週期的早期把它掛起來(例如,在應用程序入口點):

var configureViewLocator = function() { 
    var viewModelsRegex = /viewmodels/gi; 

    viewLocator.convertModuleIdToViewId = function (moduleId) { 
     return moduleId.replace(viewModelsRegex, "views"); 
    }; 
}; 

希望有幫助。

+0

它基於初學者工具包,所以是它的開啓,加上它適用於所有其他虛擬機/視圖。這只是這個看法不起作用。 – Anders

+0

你的視圖的完整路徑是「fields/readonly/number」嗎? Durandal正在尋找'viewModels'來代替'views'。如果你在require中設置了某種別名(我猜你已經基於你的模塊導入),那麼Durandal將無法解析模塊ID的'viewModel'部分。嘗試通過'convertModuleIdToViewId'方法進行調試,你應該能夠看到什麼是錯誤的。 – gerrod

+0

啊,忘記了,請看編輯 – Anders