Ember.js:迭代控制器上设置的多个模型

Ember.js:迭代控制器上设置的多个模型,ember.js,ember-data,Ember.js,Ember Data,我想声明由我的控制器加载的两个模型 我没有使用模型、前模型或后模型挂钩,因为: 我不必实现加载路由/模板 我可以在页面中独立加载每个模型(如延迟加载) 我在路线中使用setupController挂钩,因此: setupController: function(controller, model) { var that = this; controller.set('model', { stations: that.store.find(

我想声明由我的控制器加载的两个模型

我没有使用
模型
前模型
后模型
挂钩,因为:

  • 我不必实现
    加载
    路由/模板
  • 我可以在页面中独立加载每个模型(如延迟加载)
  • 我在路线中使用setupController挂钩,因此:

    setupController: function(controller, model) {
            var that = this;
    
            controller.set('model', {
                stations: that.store.find('station'),
                packages: that.store.find('package'),
            });
    }
    
    我的控制器是一个
    Ember.controller

    为了在车把中遍历这些模型,我必须使用
    model.stations.content.content
    ,这让我觉得我做错了什么:

    {{#each station in model.stations.content.content}}
    //  .....
    {{/each}}
    

    有没有更好的方法在控制器上设置这些模型,或者使用不同的控制器类型或其他东西?

    您可以更改模型以返回
    Ember.RSVP.hash
    ,它将充当承诺包,并在hash的范围内用数据填充属性
    ,因此,当模型得到解析时,它会将该哈希模式设置为控制器中的模型:

    [...]
    model: function() {
        return Em.RSVP.hash({
            stations: this.store.find('station'),
            packages: this.store.find('package')
        });
    } 
    [...]
    
    setupController: function(controller, model){
      controller.set('model', model);
      this.stations().then(function(value){
        controller.set('stations', value);  
      });
    }
    
    然后在模板中:

    {{#each item in model.stations}}
        <li>{{item.name}}</li>
    {{/each}}
    
    {{{#model.stations中的每个项}
    
  • {{item.name}
  • {{/每个}}

    {{{#model.packages中的每个项}
    
  • {{item.name}
  • {{/每个}}

    (请参阅)

    您可以将模型更改为返回
    Ember.RSVP.hash
    ,它将像一个承诺包一样工作,并在哈希范围内用数据填充属性
    stations
    packages
    ,因此当模型得到解析时,它会将该哈希模式设置为控制器中的模型:

    [...]
    model: function() {
        return Em.RSVP.hash({
            stations: this.store.find('station'),
            packages: this.store.find('package')
        });
    } 
    [...]
    
    setupController: function(controller, model){
      controller.set('model', model);
      this.stations().then(function(value){
        controller.set('stations', value);  
      });
    }
    
    然后在模板中:

    {{#each item in model.stations}}
        <li>{{item.name}}</li>
    {{/each}}
    
    {{{#model.stations中的每个项}
    
  • {{item.name}
  • {{/每个}}

    {{{#model.packages中的每个项}
    
  • {{item.name}
  • {{/每个}}

    (请参见)

    无需为模型创建新对象

    您可以在控制器中执行以下操作:

    [...]
    model: function() {
        return Em.RSVP.hash({
            stations: this.store.find('station'),
            packages: this.store.find('package')
        });
    } 
    [...]
    
    setupController: function(controller, model){
      controller.set('model', model);
      this.stations().then(function(value){
        controller.set('stations', value);  
      });
    }
    
    车站所在地:

    stations: function() {
      return this.store.find('station');
    }
    
    然后,您可以在模板中使用
    站点
    ,方法与使用模型相同。退房


    但是一个控制器只应该装饰一个模型,你可以考虑创建嵌套的路由(它会给你嵌套的控制器)。< /P> < P>你不需要为你的模型创建一个新的对象。 您可以在控制器中执行以下操作:

    [...]
    model: function() {
        return Em.RSVP.hash({
            stations: this.store.find('station'),
            packages: this.store.find('package')
        });
    } 
    [...]
    
    setupController: function(controller, model){
      controller.set('model', model);
      this.stations().then(function(value){
        controller.set('stations', value);  
      });
    }
    
    车站所在地:

    stations: function() {
      return this.store.find('station');
    }
    
    然后,您可以在模板中使用
    站点
    ,方法与使用模型相同。退房


    但是一个控制器只应该装饰一个模型,你可以考虑创建嵌套的路由(它会给你嵌套的控制器)。如果你意识到如果你有一个大的模型或者你的Ajax请求需要很长的时间,那么

    < P> @ MyKyWayJe的方法绝对是正确的方法。当模型加载时,用户界面将变为空白

    @Chaosekie建议回答我的问题,那就是等待从商店加载模型的承诺实现,然后在控制器上设置属性

    即在
    路线中

    setupController: function(controller, model) {
            this.store.find('station').then(function(stations) {
                controller.set('stations',stations);
            });
            this.store.find('package').then(function(packages) {
                controller.set('packages', packages);
            });
    }
    
    这允许使用手柄中的“正常”方式对两个模型进行迭代:

    {{#each package in packages}}
    // ....
    {{/each}}
    
    {{#each station in stations}}
    // ....
    {{/each}}
    

    @MilkyWayJoe的方法绝对是正确的方法,如果您意识到如果您有一个大型模型或AJAX请求需要很长时间,那么在加载模型时,您的UI将变为空白

    @Chaosekie建议回答我的问题,那就是等待从商店加载模型的承诺实现,然后在控制器上设置属性

    即在
    路线中

    setupController: function(controller, model) {
            this.store.find('station').then(function(stations) {
                controller.set('stations',stations);
            });
            this.store.find('package').then(function(packages) {
                controller.set('packages', packages);
            });
    }
    
    这允许使用手柄中的“正常”方式对两个模型进行迭代:

    {{#each package in packages}}
    // ....
    {{/each}}
    
    {{#each station in stations}}
    // ....
    {{/each}}
    

    我以前做过这个,但是我的模型很大,这使得页面加载非常慢,这就是为什么我在问题中解释了为什么我没有使用
    模型
    钩子,我以前做过这个,但是我的模型很大,这使得页面加载非常慢,这就是为什么我解释了为什么我没有在问题中使用
    模型
    钩子的原因哇,谢谢你的例子和一切!我仍然在使用模型钩子时遇到同样的问题,如果加载需要一段时间,我将得到一个空白屏幕,或者必须实现一个加载模板。但是,您在控制器上设置模型之前将模型加载到存储中的方法成功了!哇,谢谢你的例子和一切!我仍然在使用模型钩子时遇到同样的问题,如果加载需要一段时间,我将得到一个空白屏幕,或者必须实现一个加载模板。但是,您在控制器上设置模型之前将模型加载到存储中的方法成功了!