在Ember.js中,你如何根据回应有条件地阻止过渡?
例如,如果服务器返回403(在模型挂钩中),则显示警报并且不转换。
这是一件非常简单和常见的事情,但我找不到任何文档或指南。
这是我到目前为止所拥有的
Ember.Route = Ember.Route.extend(InfinityRoute, {
actions: {
error: function(error){
if (error.status === 403) {
this.store.createRecord('notice', {
message: "You are not authorized to view this content. Sorry man."
});
}
}
通知有效,但我想中止过渡。它可能必须移动到另一个地方,因为在运行此错误挂钩时,转换已经发生了
答案 0 :(得分:1)
实际上,从model
挂钩(或afterModel
或beforeModel
返回被拒绝的承诺本身会导致过渡失败(不继续)。所以你不要需要做任何特别的事情来中止过渡。如果你想建立一个对话框或其他东西,那么:
model: function() {
var model = this.store.find('my-model');
model . catch(displayErrorMessage);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return model;
}
如果由于某种原因您更愿意明确中止转换,请使用第二个参数:
model: function(params, transition) {
^^^^^^^^^^
return this.store.find('my-model') .
catch(() => { displayErrorMessage(); transition.abort() });
^^^^^^^^^^^^^^^^^^
}
在http://guides.emberjs.com/v1.10.0/routing/preventing-and-retrying-transitions/上的指南页面"预防和重复转换"中描述了在model
挂钩中中止转换:
在
model
,beforeModel
,afterModel
中排除转换 异步路由中描述的model
,beforeModel
和afterModel
挂钩均使用转换对象进行调用。这使得目标路由可以中止尝试的转换。
如果您想抓住所有失败的ajax请求并执行某些操作,那么您可以使用ajaxComplete
调用。这不是Ember本身,它是jQuery。在那里张贴你的对话框或消息。转换本身将由ajax错误自动中止,导致this.store.find
的承诺进入拒绝状态。或者自己中止。
请注意,如果您使用的是加载子状态,则无法中止转换并保持原状。已经太晚了。
EAGER VS.懒惰的ASYNC过渡
...一旦你提供了一个目的地路线加载子状态,你就选择了一个渴望"渴望"过渡,也就是说,不像"懒惰"默认情况下,您将急切退出源路由(并拆除其模板等),以便转换到此子状态。