ember.js从单个模板中的多个模型商店中提取

时间:2013-10-25 19:23:29

标签: ember.js

我正在尝试学习如何创建一个从多个模型中提取的表单。

例如,一个Person表单,用户可以指定他们的名称,城市,他们所属的Company(单独的模型),Group s(单独的模型)他们'重新进入,他们开车的Car(单独模型)等等。我找不到任何关于如何实现这一目标的文件。

在我看过的所有例子中,路由负责告诉模板使用哪种奇异的模型类型。我不知道如何创建从不同模型库中提取的下拉列表或预先输入。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一目标。

(1)向控制器添加一个属性,返回下拉列表的必要记录。

http://emberjs.jsbin.com/AqimiFI/4/edit

 setupController: function(controller, model) {
   this._super(controller, model);

   // set an empty array
   controller.set('states', []);

   this.get('store').find('state').then(function(states){
     //once the states are resolved set the states to the records
     controller.set('states', states);
   });
  }

(2)在您的应用程序中的某个位置(在任何合适的位置),在您的某个路径中为相关项目创建一个控制器,并将该控制器的模型设置为项目,然后使用需求。我更喜欢这种方法,因为您可以在整个应用程序中使用该控制器向其添加逻辑并将其共享等...

http://emberjs.jsbin.com/AqimiFI/5/edit

setupController: function(controller, model) {
  this._super(controller, model);

  var states = this.controllerFor('states');
  states.set('model', this.get('store').find('state'));
}

App.ApplicationController = Ember.ArrayController.extend({
  needs:['states'],

  states:function(){
    return this.get('controllers.states');
  }.property('controllers.states')
});

在这个例子中,我在应用程序路由中创建了一个状态控制器。这根本不是它与应用程序控制器/路由的关系,它只是一个早期的钩子,我可以利用创建控制器来保存数据。

要从另一个控制器访问控制器,您必须指定您需要它(需要:['states'])。

states属性正在返回状态控制器(重要的是要记住一个数组控制器,一般来说,控制器中的控制器只是模型上的装饰器)。 Ember会将所有get / set调用代理到模型(如果控制器上不存在)。所以当我正在返回状态控制器时,你可以把它想象成只返回模型,即状态数组。

因此,您可以尝试在控制器上设置属性,但它可能无法按预期工作。我正在利用这样一个事实,即我知道如果我在模型上设置一个承诺,它将实际解决该承诺,并用该承诺的结果替换模型。它只是更接近手动创建控制器的预期行为。