Ember 从父级转换时子路由模型方法不会触发
Ember sub route model method doesn't trigger when transitioning from parent
我有一个消息路由和消息子路由:
// 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);
}
});
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);
}
}
试一试。
您还可以查看 beforeModel and afterModel 以更好地了解路由过程以及如何将它们用作替代方案,但我认为 setupController 最适合您正在做的事情。
我有一个消息路由和消息子路由:
// 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);
}
});
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);
}
}
试一试。
您还可以查看 beforeModel and afterModel 以更好地了解路由过程以及如何将它们用作替代方案,但我认为 setupController 最适合您正在做的事情。