ember.js如何处理ManyToMany关系的创建?

时间:2013-07-26 21:27:10

标签: php ember.js many-to-many

让我们说在我的后端我有模型DealerCar,两者都与Ember中的ManyToMany关系相关联。我可以在后端手动创建关系,然后在使用Ember视图显示关系时,我可以轻松地在其商品中显示Dealer X Car 1Car 2Car 3。此外,在显示Car时,我可以显示包含Dealers模型的所有Car

现在我需要添加一些编辑可能性,我的意思是,在我编辑Car的示例中,我想选择Dealers的{​​{1}}他的提议。 (我需要这种编辑的可能性只针对关系的一方 - 而不是两者,所以我可以接受我能够将Car添加到Dealers但不需要在相反的方向上这样做(这正是我的背景如何运作)

所以在Cars我创建了App.CarControlleraddDealerToCar之类的操作,他们向后端发送了适当的查询,从而保存了关系。

问题是:如何制作一些字段,这将允许我选择deleteDealerFromCar即。使用选择框或其他下拉列表,然后调用将发送到后端的操作?

1 个答案:

答案 0 :(得分:2)

我最近通过使用复选框实现了在表单中添加多对多关系。这适用于我的用例,因为我只有两到六个经销商,您可以选择特定的汽车。如果你有更多,这可能不合适。

以下是我用于转换为您的方案的代码。我从这个问题的代码中获取灵感:Many to Many Relationships with Ember, ember-data and Rails

查看:

App.CarEditView = Ember.View.extend({

  dealerCheckbox: Ember.Checkbox.extend({

    init: function(){
      this._super();
      var self = this;
      // start off with the checkboxes checked for any dealer that
      // has this car already
      this.get('car.dealers').forEach(function(dealer){
        if(dealer.get('id') == self.get('dealer.id')){
          self.set('checked', true);
        }
      });

    },

    checkedObserver: (function(){
      var car = this.get('car');
      if(this.get('checked'))
        car.addDealerToCar(this.get('dealer'));
      else
        car.deleteDealerFromCar(this.get('dealer'));
    }).observes('checked')

  })

});

模板(这将是编辑汽车的表格的一部分):

<div class="control-group">
  <label class="control-label">Required Signatures</label>

  <div class="controls">
    {{#each dealer in controller.allDealers}}
      <label class="checkbox">

        {{view view.dealerCheckbox
          carBinding="controller.content"
          dealerBinding="dealer"
        }}
        {{dealer.title}}

      </label>
    {{/each}}
  </div>
</div>

您需要添加类似的内容才能使上述代码正常工作,以便您可以访问所有经销商的列表。

App.CarEditRoute = Ember.ObjectController.extend({

  setupController: function(controller, model) {
    this._super(controller, model);
    controller.set('allDealers', App.Dealer.find());
  }

});