Javascript 在Ember.js中,通过ajax加载选择选项的最佳实践是什么?

Javascript 在Ember.js中,通过ajax加载选择选项的最佳实践是什么?,javascript,jquery,ajax,ember.js,Javascript,Jquery,Ajax,Ember.js,我有一个表单包含如下选择元素: <table> <tbody> <tr> <th>Keyword</th> <td>{{input type="text" value=job.keyword}}</td> </tr> <tr> <th>Color</th> <td&

我有一个表单包含如下选择元素:

<table>
    <tbody>
    <tr>
        <th>Keyword</th>
        <td>{{input type="text" value=job.keyword}}</td>
    </tr>
    <tr>
        <th>Color</th>
        <td>{{view "select" content=colors optionLabelPath="content.name" optionValuePath="content._id"
            value=job.colorID}}</td>
    </tr>
    </tbody>
</table>
但是,我认为
颜色不应该是模型的一部分——它应该属于控制器或视图。
是否有任何实践可以在控制器或视图中而不是模型钩子中优雅地加载数据

任何帮助都将不胜感激


谢谢。

您不应该在余烬控制器或视图中加载外部数据,路由就是这样做的地方。您基本上有两种选择:

  • 使用模型挂钩(为什么不为作业和颜色创建模型?)
  • 使用如下方法:

    setupController: function(controller) {
      this._super.apply(this, arguments);
    
      this.store.findAll('color').then(function(colors) {
        this.set('colors', colors);
      }.bind(controller));
    },
    

第二个选项的缺点是,余烬不会等待颜色加载后再切换到此页面。

@Thormas Brus,谢谢您的回复。目前,我确实使用模型挂钩来加载作业和颜色。但是当我需要传输到JobDetailRoute时,钩子将永远不会被调用。然后,我必须加载上一个路由/控制器中的颜色。然后,我在可能过渡到JobDetailRoute的每个位置加载颜色。例如,在job list中,颜色数据在列表中是无用的,但我必须加载它们,因为下一个路由需要它们来呈现select元素。我认为其他路线/控制器不应该关心颜色。请原谅我的英语,希望你能理解。我明白你在说什么。这也是我碰到的。您可以使用id而不是模型的链接,以便Ember再次调用模型挂钩。否则,我列出的第二个选项是我认为应该走的路。此外,我认为路由器有责任获取您希望显示的所有数据,因此,即使路由名为JobDetailRoute,从其他型号获取数据仍然是可以接受的。谢谢!你的“链接到id”是个好主意!这是我遇到的最好的解决方案!第二个选项可以优化:在加载颜色之前在表单中使用一些占位符。
setupController: function(controller) {
  this._super.apply(this, arguments);

  this.store.findAll('color').then(function(colors) {
    this.set('colors', colors);
  }.bind(controller));
},