【问题标题】:Ember.js: How to represent a has-many model relationship?Ember.js:如何表示 has-many 模型关系?
【发布时间】:2013-11-19 17:30:43
【问题描述】:

我正在尝试设置一个 ember 应用程序,其中有很多项目,所有项目都有很多选项。然后我需要一个“仪表板”区域,我可以在其中监控所有项目/选项的信息。

a previous post 中,我得到了一个仪表板的工作示例,它监控单个项目集合。
如何更新它以表示每个项目的子选项?

Javascript - from jsBin (updated)

App = Ember.Application.create();

/* ROUTES */
App.Router.map(function() {
  this.resource('items');
  this.resource('dashboard');
});
App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('items');
  }
});
App.ItemsRoute = Ember.Route.extend({
  model: function() {
    var a = Em.A();
    a.pushObject( App.Items.create({title: 'A', cost: '100'}));
    a.pushObject( App.Items.create({title: 'B', cost: '200'}));
    a.pushObject( App.Items.create({title: 'C', cost: '300'}));
    return a;
  }
});

/* MODELS */
App.Items = Ember.Object.extend({
  title: '',
  cost: '',
  quantity: ''
});


/* CONTROLLERS */
App.ItemsController = Ember.ArrayController.extend({
  legend: 'test',
  len: function(){
    return this.get('length');
  }.property('length'),
  totalCost: function() {
    return this.reduce( function(prevCost, cost){
      return parseInt(cost.get('cost'),10) + (prevCost || 0);
    });
  }.property('@each.cost')
});
App.DashboardController = Em.Controller.extend({
  needs: ['items'],
  itemsLength: Ember.computed.alias('controllers.items.len'),
  itemsTotalCost: Ember.computed.alias('controllers.items.totalCost')  
});

车把

 <script type="text/x-handlebars" data-template-name="application">
  <p><strong>Ember.js example</strong><br>Using an a dashboard that monitors 'items'.</p>
    {{render dashboard}}
    {{outlet}}
  </script>

  <script type="text/x-handlebars" data-template-name="items">
    <h2>Items:</h2>
    <dl>
      {{#each}}
        <dt>Title: {{title}}</dt>
        <dd>Cost: {{cost}} {{input value=cost}}</dd>
      {{/each}}
    </dl>
  </script>

  <script type="text/x-handlebars" data-template-name="dashboard">
    <h2>Overview:</h2>
    {{#if controllers.items}}
    <p>Total number of items (expect 3): {{itemsLength}}<br>
    Total cost of items (expect 600): {{itemsTotalCost}}</p>
    {{/if}}
  </script>

【问题讨论】:

    标签: javascript ember.js relationship


    【解决方案1】:

    首先,我建议使用 ember 数据/ember 模型之类的客户端记录管理框架,它们有点学习曲线,但从长远来看非常棒。如果你不想这样做,你可以按照你已经建立的模型创建相同的模式。

    http://jsbin.com/IpEfOwA/3/edit

    【讨论】:

    • 我无法让仪表板像监控项目一样监控选项。看起来 controllers.options 不存在 - 为什么会这样? jsbin.com/ugoTAguB/3/edit?html,js,output
    • 因为您从未创建过任何使用选项控制器的东西。你想在仪表板中完成什么?计算所有项目中的所有选项?从项目控制器中获取项目,并通过计算选项对其进行迭代。
    • 仪表板将需要来自项目和选项的所有数据,以便它可以进行各种计算。重要的是,当某些项目/选项属性发生变化时,它也需要更新。我认为通过项目访问选项不允许仪表板观察选项更改。真的吗? jsbin.com/IyamobAf/5/edit?html,js,output
    • 当然,只需在监视选项的项目级别和监视项目的项目控制器级别添加一个计算属性jsbin.com/eZuzoCAT/1/edit
    • 如果你没有定义一个项目控制器,它只会迭代模型中的项目(它从控制器向下代理)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多