2014-02-24 33 views
2

我使用render幫助創建在他們的控制器,其界定content方法獲取自己的數據部件:是否可以傳遞非模型數據來呈現幫助器?

{{render "popular_posts"}} 

App.PopularPostsController = Ember.ArrayController.extend({ 
    content: function() { 
     return this.store.find('post', { order_by: 'views', per: 5 }; 
    }.property() 
}) 

這工作得很好,但帖子可以被標記,當我爲特定頁面上標記,我想重複使用相同的窗口小部件,但我需要將標記傳遞給它才能顯示熱門帖子,只顯示特定標記。

目前我從父控制器獲取標記,如果它存在,我將它添加到請求查詢參數。但是,像這樣渲染(不通過模型對象)會導致PopularPostsController成爲單例,因此它在每個頁面上顯示相同的數據。

我可以改變它是非單是這樣的:

App.register(
    'controller:popular_posts', 
    App.PopularPostsController, 
    {singleton: false} 
); 

和它的作品,但它會是巨大的,能夠(在我的情況tag)數據傳遞到比模型其它render幫手。有什麼辦法可以做到嗎?

回答

1

渲染需要第二個參數,這是您希望渲染控制器使用的模型。沒有什麼特別的「模型」傳遞給渲染,你可以通過任何東西(例如,對象,對象數組等)

所以,你應該能夠做到:

{{render "popularPosts" tags}} 

這將使用popular_posts模板並實例化PopularPostsController並將模型設置爲您的標籤數組。然後,您可以訪問tags在popular_posts模板,就像你通常會:

{{#each}} 
    {{this}} <!-- this refers to a tag --> 
{{/each}} 

如果你提供了一個模型,然後{{render}}{[render}}實例化控制器的新實例,而不是使用一個單身,所以你不會需要指定PopularPostsController不是單例。

更新:

這裏是你如何可以建立使用基於您的評論的自包含的部件一個部件的一些信息。

組件是不錯的,因爲你可以設置一堆參數,這樣您的自定義組件:

{{my-component tag=tag sortOrder=sortOrder sortColumn=sortColumn}} 

(注意,組件名稱底線轉換,而不是駝峯)

在組件本身你可以搶根據傳遞的數據參數是這樣的:

App.MyComponent = Ember.Component.extend({ 
    getData: function(){ 
     var tag = this.get('tag'); 
     var sortOrder = this.get('sortOrder'); 
     var sortColumn = this.get('sortColumn'); 
     //make your ajax call here to retrieve data   
     this.set('posts', dataFromAjax); 
    }.on("init") 
}); 

而不是使用on事件的風格,你的可以只覆蓋初始化以及這樣的:

App.MyComponent = Ember.Component.extend({ 
    init: function(){ 
     this._super(); //don't forget to call the parent init if you use this method 
     var tag = this.get('tag'); 
     var sortOrder = this.get('sortOrder'); 
     var sortColumn = this.get('sortColumn'); 
     //make your ajax call here to retrieve data   
     this.set('posts', dataFromAjax); 
    } 
}); 

的參數使用組件(具有{{render}}是不可能的)的時候,所以你可以看到關於sortOrdersortColumn變化而改變使用Ember.computed.sort職位的排序順序約束:

App.MyComponent = Ember.Component.extend({ 
    getData: function(){ 
     var tag = this.get('tag'); 
     var sortOrder = this.get('sortOrder'); 
     var sortColumn = this.get('sortColumn'); 
     //make your ajax call here to retrieve data 
     this.set('posts', dataFromAjax); 
    }.on("init"), 
    sortProperties: function(){ 
     return [this.get('sortColumn') + ':' + this.get('sortOrder')]; 
    }.property('sortColumn', 'sortOrder'), 
    sortedPosts: Ember.computed.sort('posts', 'sortProperties'), 
}); 

這非常翔實的博客文章對使用Ember.Computed.sort更多的信息:

http://balinterdi.com/2014/03/05/sorting-arrays-in-ember-dot-js-by-various-criteria.html

像往常一樣灰燼導其實是非常好的,我會建議找過來真正的快速:

http://emberjs.com/guides/components/

+0

我可以通過標籤,就像你顯示,然後用這些標籤在控制器的查詢中獲取真實模型,即帖子? – szimek

+0

當你在一個標籤的頁面上時,該頁面是否有路線?例如'/ tag/1'。如果是這樣,那麼我可能會從路由本身獲取標籤數據。 – Sarus

+0

這取決於。該小部件可以呈現在不同的模板中,例如,那些通過路由'/ videos'或'/ videos /:tag'呈現的。我正在尋找一種方法來創建一個裝載它自己的模型數據的小部件/組件,但是可以傳遞一些額外的數據用作查詢中的過濾器(例如標記名稱,限制,順序等),以便它可以在任何模板中使用,而無需修改其父控制器。 – szimek

相關問題