从路由的beforeModel访问控制器

时间:2014-02-05 17:57:17

标签: javascript ember.js rsvp.js

我想从路径上的beforeSend钩子中访问我的路由控制器,以利用承诺逻辑上的暂停。

这是我目前的解决方法,可以在我的控制器上设置“category_config”,这是从beforeModel中的promise中获得的。

Imaging.ReferenceRoute = Ember.Route.extend(Imaging.Ajax, {
  setupController: function(controller, model) {
    controller.set('error_messages', []);
    controller.set('category_config', this.get('category_config'));
    return this._super(controller, model);
  },
  beforeModel: function(transition) {
    var categories;
    categories = this._promise("/url/foo/", "GET");
    return Ember.RSVP.all([categories]).then(((function(_this) {
      return function(response) {
        return _this.set('category_config', response[0]);
      };
    })(this)));
  },
  model: function() {
    return Imaging.Document.find();
  }
});

如果你很好奇,我的_promise助手就在下面:

_promise: function(url, type, hash) {
  return new Ember.RSVP.Promise(function(resolve, reject) {
    hash = hash || {};
    hash.url = url;
    hash.type = type;
    hash.dataType = "json";
    hash.success = function(json) {
      return Ember.run(null, resolve, json);
    };
    hash.error = function(json) {
      if (json && json.then) {
        json.then = null;
      }
      return Ember.run(null, reject, json);
    };
    return $.ajax(hash);
  });
}

如果没有让beforeModel在路由上设置'category_config',然后在setupController中的控制器上设置它,我怎么能这样做呢?

1 个答案:

答案 0 :(得分:6)

未经测试,但我认为您可以使用Ember.RSVP.hash

返回包含Imaging.Document.find()_promise("/url/foo/", "GET");的元组
Imaging.ReferenceRoute = Ember.Route.extend(Imaging.Ajax, {
  setupController: function(controller, model) {
    controller.set('error_messages', []);
    controller.set('category_config', model.category_config);
    return this._super(controller, model.document);
  },  
  model: function() {
    return Ember.RSVP.hash({
      document: Imaging.Document.find(),
      category_config: this._promise("/url/foo/", "GET")
    });
  }
});