2013-05-27 25 views
2

我已經定義了一個View子類MenuitemView,我從模板中引用(見下文)。但是Ember找不到它。我不斷收到此錯誤: 錯誤:斷言失敗:無法在路徑'App.MenuitemView'中查找視圖。我錯過了什麼?Ember找不到我的視圖

初始化代碼:

window.require.register("initialize", function(exports, require, module) { 
    var App; 
    App = require('app'); 
    App.Router.map(function(){}); 
    require('routes/IndexRoute'); 
    require('templates/menuitem'); 
    require('templates/application'); 
    require('templates/index'); 
    App.initData(); 
}); 

視圖定義:

window.require.register("views/MenuItemView", function(exports, require, module) { 
    var App; 
    App = require('app'); 
    module.exports = App.MenuitemView = Em.View.extend({ 
    templateName: 'menuitem', 
    visibility: function(){ 
     if (App.selectedDishType && !App.selectedDishType === this.get('dish').get('type')) { 
     return 'invisible'; 
     } else { 
     return ''; 
     } 
    } 
    }); 
}); 

模板參照視圖(模板/ index.hbs):

{{#each item in content}} 
    {{view App.MenuitemView itemBinding=item}} 
{{/each}} 

視圖模板(模板/菜單項。 hbs)

<div class="dishitem"> 
    <div class="dishimage"> 
     {{thumbnail item.dish.identifier}} 
    </div> 
    <div class="dishdetails"> 
     <p class="dishname">{{uppercase item.dish.name}}</p> 
     <p class="dishdescription">{{item.dish.description}}</p> 
     <ul class="packages"> 
     {{#each package in item.packages}} 
      <li> 
       <span class="packageprice">€ {{package.price}}</span> 
       <span class="packagespec"> 
        {{#if package.description}}({{package.description}}){{/if}} 
       </span> 
      </li> 
     {{/each}} 
     </ul> 
    </div> 
</div> 
+0

我可能會說一些明顯的,window.require.register構造對我來說是未知的,但如果它找不到App.MenuitemView,那麼我會查看JavaScript命名空間並測試您是否能夠調用該對象。簡單的定義了項目調用alert(App); alert(App.MenuitemView);看看會發生什麼,並可能與調試器一起玩。 – Ragnar

回答

2

這個問題是由於我使用Brunch來構建應用程序,並且所有的javascript組件和模板都在單獨的文件中。 Brunch然後編譯模板來分離common.js javascript模塊。模板編譯模塊中的代碼無權訪問視圖模塊中定義的視圖。通常處理這種依賴的方法是在依賴模塊的javascript中添加「require('my-other-module')」。但是,由於我的模板源不是JavaScript,而是句柄,我無法將其添加到源代碼中。 解決方案是確保您的應用程序名稱空間是全局可用的。您可以通過不將應用程序初始化代碼放入模塊中來實現這一點,例如直接在HTML中,腳本標籤中:

<script> 
App = require('app'); 
</script> 
+0

優秀。我有一個與呃工具類似的問題。我通過使用'{{view}}'而不是'{{outlet}}來修復它,但是您的回答讓我想到了正確的方向。 – Ziggy

+0

我注意到你在原代碼中有'{{view}}',所以我猜brunch和ember-tools在這方面有所不同。 – Ziggy

0

我注意到的是,menuitemview的'item'部分有時是大寫(views/MenuItemView),有時是小寫。這可能是錯誤消息的來源嗎?

+0

好的觀察,謝謝。但在我的原始代碼中它是一致的,所以它不是問題的原因。 –

0

我遇到與Ember的工具了類似的問題,接受的答案讓我在正確的道路上。我將在這裏爲我的後代留下我的解決方案。

我有我的應用程序設置是這樣的:

var FooRoute = Ember.Route.extend({ 
    ... 
    renderTemplate: function() { 
    this.render(); 
    this.render('Bar', {into: 'foo', outlet: 'bar', controller: 'foo' }); 
    }, 
    ... 
}); 

,並在模板foo.hbs

{{outlet bar}} 

這是造成爲同各種各樣的原因在接受的答案@RudiAngela提到的問題。相反,包括<script>標籤,不過,我只是改變了{{口}}到{{圖}},

{{view App.Bar}} 

,這解決了這個問題對我來說。