从父级转换时,不会触发Ember子路径模型方法

时间:2015-01-16 20:55:47

标签: javascript ember.js

我有一条消息路由和消息子路由:

  // routes
  this.resource('messages');
  this.resource('message', { path: '/messages/:message_id' });

由于后端架构(我无法控制),我需要为消息调用单独的ajax调用(实际上是一组消息预览 - 没有消息,只是主题)和完整的消息对象。

但是,当来自消息路由时,Ember会忽略消息路由模型方法吗?当直接调用该消息路由时, 会触发它。我怎样才能让Ember始终调用消息路由模型方法?

以下是我目前的情况:

App.MessageRoute = Ember.Route.extend({
  model : function (params) {
    return Ember.$.ajax({
      url: '/getMessage.do'
    });
  },
  setupController: function (controller,  model) {
    console.log('model: ', model);
    console.log('model set? : ', this.get('modelLoaded'));
    var message = App.Message.create({
      message: model.data.content
    });
    controller.set('model', message);
  }
});

App.MessagesRoute = Ember.Route.extend({
  model : function (params) {
    return Ember.$.ajax({
      url: '/getMessagePreveiws.do'
    });
  },
  setupController: function(controller, model){
    var messages = [];
    model.data.forEach(function (message) {
      messages.push(App.Message.create({
        id: message.id,
        subject: message.subject,
        date: message.date_created,
        read: message.read,
        deleted: message.deleted
      }));
    });
    controller.set('model', messages); 
  }
});

1 个答案:

答案 0 :(得分:2)

Ember设计了model勾,用于外出并在您没有​​路线时抓取适当的路线数据。在您的情况下,您通过link-to帮助程序将数据作为参数传递,因此Ember决定它不需要运行model挂钩,因为它已经有数据。

另一方面,

setupController应始终开火(至少我没有发现......)。因为听起来你可以直接进入url并且它可以工作,所以保持模型钩子的方式,但添加它的内容承诺setupController钩子:

setupController: function (controller,  model) {
  //Check if model has the data you were expecting
  //and if it doesn't, use the model hook logic
  if(Ember.isEmpty(model.data.content)){  
    Ember.$.ajax({
      url: '/getMessage.do'
    }).then(function(response){ // wait for the response... 
      var message = App.Message.create({
        message: response.data.content
      });
      controller.set('model', message);
    });
  } else {
    var message = App.Message.create({
      message: model.data.content
    });
    controller.set('model', message);
  }
}

试一试。

您还可以查看beforeModelafterModel,以便更好地了解路线流程以及如何将它们用作替代方案,不过我认为setupController最适合您和#39做的。