2014-10-28 76 views
2

我不知道爲什麼我的模板沒有在指定插座中呈現。這是我第一次嘗試學習燼,我被困在了指定的網點。Ember:指定插座出錯

我想呈現sidebarTemplate{{outlet "sidebar"}}的ContentTemplate{{outlet "content"}},但我不斷收到在控制檯以下錯誤:「錯誤在處理路線:帖子無法讀取屬性未定義‘connectOutlet’類型錯誤:無法讀取的未定義的屬性 'connectOutlet'」

這裏是一個小提琴我的代碼:http://jsfiddle.net/va71wwr9/

這裏是我的HTML:

<script type="text/x-handlebars"> 
    <div class="nav-container"> 
    <ul class="nav"> 
     <li>{{#link-to 'home'}}Home{{/link-to}}</li> 
     <li>{{#link-to 'posts'}}Posts{{/link-to}}</li> 
    </ul> 
    </div> 

    {{outlet}} 
</script> 

<script type="text/x-handlebars" id="home"> 
    <h1>Home screen</h1> 
</script> 

<script type="text/x-handlebars" id="posts"> 
    <h1>Posts screen</h1> 
    <div class="sidebar-container"> 
    {{outlet sidebar}} 
    </div> 
    <div class="content-container"> 
    {{outlet content}} 
    </div> 
</script> 

<script type="text/x-handlebars" id="sidebarTemplate"> 
    <p>Side bar stuff</p> 
</script> 

<script type="text/x-handlebars" id="contentTemplate"> 
    <p>content stuff</p> 
</script> 

這裏是我的JavaScript:

var App = Ember.Application.create(); 

App.Router.map(function() { 
    this.resource('home', {path: '/'}); 
    this.resource('home', {path: 'home'}); 
    this.resource('posts', {path: 'posts'}); 
}); 

App.PostsRoute = Ember.Route.extend({ 
    renderTemplate: function() { 
    this.render('sidebarTemplate', { 
     into: 'posts', 
     outlet: 'sidebar' 
    }); 
    this.render('contentTemplate', { 
     into: 'posts', 
     outlet: 'content' 
    }); 
    } 
}); 

回答

4

的問題是,你不渲染posts模板。定義你在得到呈現路線的網點的模板之前,您可以通過添加this.render()this._super()解決這個問題:在擴展功能

App.PostsRoute = Ember.Route.extend({ 
    renderTemplate: function() { 

     // add this line 
     this._super(); 

     this.render('sidebarTemplate', { 
      into: 'posts', 
      outlet: 'sidebar' 
     }); 
     this.render('contentTemplate', { 
      into: 'posts', 
      outlet: 'content' 
     }); 
    } 
}); 

只是一個音符;在這個特殊的代碼,調用this._super()技術上是與調用this.render(),但不同的是,通過調用_super()你被追加你的東西是什麼方法會做自己的,延長renderTemplate功能,這在本案例將會是this.render(),也許這個方法可能需要執行的另一個例程(一般來說,不是排除在renderTemplate之間),而如果您調用自己想要的方法(在這種情況下爲render方法),您將會從流程中排除其他東西,這種方法可能執行。這是不對還是錯。這真的取決於你想達到什麼。對於大多數情況,您應該調用this._super(),而不是在您正在擴展的方法做了不止一件事情和/或將來做一件事情時重新編寫實現。

+0

謝謝!!!!我遵循Ember文檔來渲染模板,我發現他們也沒有調用'this.render()'。有沒有更好的方式來構建我的代碼?以下是我參考的文檔頁面:http://emberjs.com/guides/routing/rendering-a-template/ – Mdd 2014-10-28 00:46:22

+1

請記住,文檔不包含所有可能的方案。我編輯了我的答案來解釋一點。希望這可以幫助。 – MilkyWayJoe 2014-10-28 01:00:58

+0

再次感謝您!我從Ember看到的東西給我留下了深刻的印象,但我現在正試圖與之合作。我希望我能給你更多的選票。 – Mdd 2014-10-28 01:06:08