2013-10-28 13 views
0

我有一個訂單列表。如何使用在Ember js控制器中承諾的過濾結果

  • order1
  • order2
  • order3

    每個訂單都有一些項目

    • Order1
      • 第11項
      • item12
    • Order2
      • item21
      • item22
    • Order3
      • item31
      • item32

    我這樣定義模型(不使用的hasMany關係):

    App.Order = DS.Model.extend({ 
        orderNote: DS.attr('string')}); 
    
    App.Item = DS.Model.extend({ 
        ItemName: DS.attr('string'), 
        orderId: DS.attr('string')}); 
    

目的: 當我NAV路由 「的index.html#/命令」, 我想告訴所有該訂單的物品放在一起,隨後如下

<ul> 
    <li> 
    <p>order1_note</p> 
    <ul> 
     <li>Item11</li> 
     <li>Item12</li> 
    </ul> 
    </li> 

    <li> 
    <p>order2_note</p> 
    <ul> 
     <li>Item21</li> 
     <li>Item22</li> 
    </ul> 
    </li> 

    <li> 
    <p>order3_note</p> 
    <ul> 
     <li>Item31</li> 
     <li>Item32</li> 
    </ul> 
    </li> 
</ul> 

我曾試圖用一個嵌套的每一個幫手,

我使用

var currentOrderId = order.get('id');

變種RET = this.store.filter( '項目',{PID,currentOrderId},函數(項目){返回 item.get( '訂單ID')= currentOrderId})

但如何我可以用過濾後的結果(承諾)作爲中的OrderItems我temlate?

<ul> 
    {{#each order in orders ItemController="order"}} 
    <li> 
    {{orderNote}} 
     <ul> 
     {{#each orderItems}} 
      <li>item</li> 
     {{/each}} 
     </ul> 
    </li> 
    {{/each}} 
</ul> 

編輯

得到它的工作原理, 多虧了這則訊息(( Adding item to filtered result from ember-data ))但是,這是正確的「灰燼方式」?

<script type="text/x-handlebars" data-template-name="orders"> 
    <ul> 
     {{#each order in controller itemController= 'order'}} 
     <li>{{name}}</li> 
     <hr /> 
     <ul> 
     {{#each item in items.content}} 
      <li> 
       {{item.name}} 
      </li> 
     {{/each}} 
     </ul> 
     {{/each}} 
    </ul> 
    </script> 

這裏是itemController

App.ProjectController =Ember.ObjectController.extend({ 
    oid:function(){ 
    return this.get('content').get('id'); 
    }.property(), 

    items: function(){ 
    var self = this; 
    var oid = self.get('id'); 
    var itemPromise= self.store.filter('item', {orderId: oid},function (item) { 
     return item.get('orderId')==oid; 
    }); 
    //itemPromise is a promise. 
    // cached in the callback as value? 
    itemPromise.then(function(value){ 
     self.set('items',value); 
    }); 
    }.property() 

}); 

回答

0

不,這不是真正的灰燼之路。相反,您應該使用belongsTohasMany直接在模型之間建立關係。

App.Order = DS.Model.extend({ 
    orderNote: DS.attr('string'), 
    items:  DS.attr('hasMany') 
}); 

App.Item = DS.Model.extend({ 
    ItemName: DS.attr('string'), 
    order: DS.attr('belongsTo') 
}); 

然後您的模板只使用items集合。

<script type="text/x-handlebars" data-template-name="orders"> 
<ul> 
    {{#each order in orders ItemController="order"}} 
    <li> 
    {{orderNote}} 
     <ul> 
     {{#each items}} 
      <li>{{ItemName}}</li> 
     {{/each}} 
     </ul> 
    </li> 
    {{/each}} 
</ul> 
</script> 

有關詳細信息,請參閱「查找模型」指南中的「定義關係」部分。

http://emberjs.com/guides/models/defining-models/#toc_defining-relationships

+0

謝謝傑里米,雖然有點晚了。 – adam