如果我在具有慢模型挂钩的路由上使用transitionTo,则load.hbs状态永远不会被触发(我在所有级别都有loading.hbs文件 - cluster,cluster.schedule和cluster.schedule.preview_grid )。我尝试在cluster.schedule preview_grid-loading.hbs
重命名一个没有运气。
在transitionTo上,没有传入模型或模型ID,只有路径:
viewPreviewGrid: function() {
this.transitionTo('cluster.schedule.preview_grid');
},
我还有一个加载动作,定义如下:
loading(transition) {
var controller = this.controller;
if (!Ember.isNone(controller)) {
this.controller.reset();
}
transition.promise.finally(function() {
NProgress.done();
});
}
在转换期间,调用页面只停留在上一个路径上,直到模型挂钩中的promise解析,然后转换到另一个路径。如果我刷新页面,加载状态会被触发就好了。这是transitionTo的已知行为吗?
这是我的模型钩子:
model: function (/*params*/) {
var socialProfile = this.modelFor('cluster.schedule').get('firstObject');
if (!socialProfile.get('isInstagram')){
throw new Error("Attempted to access preview with non-ig profile: " + socialProfile.get('id'));
}
var accessToken = socialProfile.get('token');
var self = this;
return Ember.RSVP.hash({
igPosts: new Ember.RSVP.Promise(function(resolve) {
self.getUsersRecentMedia(accessToken).then(function(response) {
var igPosts = Ember.A([]);
response.data.forEach(function(data) {
igPosts.pushObject(self.igPostFromResponse(data, socialProfile));
});
resolve(igPosts);
});
}),
posts: new Ember.RSVP.Promise(function(resolve) {
self.store.query('gram', { type: 'preview', social_profile_id: socialProfile.get('id'), limit: self.get('postLimit') }).then(function(grams) {
var filteredGrams = grams.filter(function(gram) {
return (gram.get('scheduledInFuture')) && (gram.belongsTo('socialProfile').id() === socialProfile.get('id')) && (gram.get('active'));
});
resolve(filteredGrams);
});
}),
igUser: new Ember.RSVP.Promise(function(resolve) {
self.getSelf(accessToken).then(function(response) {
resolve(self.igUserFromResponse(response.data, socialProfile));
});
})
});
},
答案 0 :(得分:0)
您需要在return true
挂钩的末尾loading()
告诉Ember继续显示默认加载路由(loading.hbs
)。
loading(transition) {
var controller = this.controller;
if (!Ember.isNone(controller)) {
this.controller.reset();
}
transition.promise.finally(function() {
NProgress.done();
});
return true;
},