在路线上加载不相关的模型

时间:2014-03-14 09:22:03

标签: ember.js routing ember-data

我有两个名为'Scenario'和'Event'的模型,它们是通过RESTAdapter加载的。

在'scenario.index'路线上我只需要场景,但在'场景'路线上我需要一个所有事件的列表,所以我可以提供一个表格将它们与显示的场景相关联。

使用下面的代码,如果我直接访问“方案”路线,这是有效的,但如果我首先访问'scenario.index'路线然后访问'方案'路线则不行。

我的意思是如果我第一次去ScenariosIndexRoute就不会调用ScenarioRoute.model()。

App.Router.map(function()
{
    this.resource('scenarios', function()
    {
        this.resource('scenario', {path: '/:id'});
    });
});

App.ScenariosIndexRoute = Ember.Route.extend({
    model: function()
    {
        return this.store.find('scenario');
    }
});

App.ScenarioRoute = Ember.Route.extend({
    model: function(params)
    {
        return {
            scenario: this.store.find('scenario', params.id),
            events: this.store.find('event')
        };
    }
});

我该怎么做?

2 个答案:

答案 0 :(得分:2)

在您的情况下,我认为实现此目的的最简单方法是为事件创建另一个路由和控制器,并根据事件控制器的需要挂起场景控制器。

我认为这是因为“最好”的方法是使用依赖注入,但这并不是很简单。

如果你有勇气,请随时阅读:http://discuss.emberjs.com/t/some-improvement-ideas-for-our-di-subsystem/2378

但正如在论坛上讨论的那样,这对你有用吗? (对于其他人未来的启发):

App.PostRoute = Ember.Route.extend({
  afterModel: function(transition) {
    var self = this;
    var postsController = this.controllerFor('posts');
    if(Ember.isEmpty(postsController.get('allEvents'))) {
      // find returns a promise. We attach a "then" "callback" to it
      // so that "callback" will execute after the store's find promise has resolved
      self.store.find('event').then(function(events) {
        postsController.set('allEvents', events)
      });
    }
  }
});

答案 1 :(得分:0)

这是我解决这个特定用例的方法:

App.ScenarioRoute = Ember.Route.extend({
  model: function(params) {
    var scenario = this.store.find('scenario', params.id);
    scenario.then(function(scenario) {
      scenario.get('events)
    });
    return scenario;
  }
});

也就是说,你是另一个链接的承诺:store.find返回一个promise,然后我们使用“then”调用来获取场景中的事件。