0

我有一份订单清单。

  • 订单1
  • 订单2
  • 订单3

    每个订单都有一些项目

    • 订单1
      • 第 11 项
      • 第 12 项
    • 订单2
      • 第 21 项
      • 第 22 项
    • 订单3
      • 第 31 项
      • 第 32 项

    我这样定义模型(不使用 hasMany 关系):

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

目的:当我导航路由“index.html#/orders”时,我想显示所有订单及其项目,如下所示

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

var ret = this.store.filter('item',{pid,currentOrderId},function(item){return item.get('orderId')=currentOrderId})</p>

但是如何在我的模板中使用过滤器结果(承诺)作为 orderItems?

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

编辑

得到它的工作,感谢这篇文章对查找和过滤有很好的解释,也是一个鼓舞人心的自我在控制器中的用法,(( 将项目添加到来自 ember-data 的过滤结果 ))但是,这仍然是正确的“Ember 方式”吗? ?

<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()

});
4

1 回答 1

0

不,这不是真正的 Ember 方式。相反,您应该使用belongsToandhasMany直接在模型之间建立关系。

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

于 2013-10-29T21:02:24.940 回答