ember-data 没有解决它(可能不会),但您可以重新打开 DS 类并扩展 ajax 方法。
它看起来像这样:
ajax: function(url, type, hash) {
hash.url = url;
hash.type = type;
hash.dataType = 'json';
hash.contentType = 'application/json; charset=utf-8';
hash.context = this;
if (hash.data && type !== 'GET') {
hash.data = JSON.stringify(hash.data);
}
jQuery.ajax(hash);
},
你可以用这样的东西重写它(免责声明:未经测试,可能行不通):
DS.reopen({
ajax: function(url, type, hash) {
var originalError = hash.error;
hash.error = function(xhr) {
if (xhr.status == 401) {
var payload = JSON.parse(xhr.responseText);
//Check for your API's errorCode, if applicable, or just remove this conditional entirely
if (payload.errorCode === 'USER_LOGIN_REQUIRED') {
//Show your login modal here
App.YourModal.create({
//Your modal's callback will process the original call
callback: function() {
hash.error = originalError;
DS.ajax(url, type, hash);
}
}).show();
return;
}
}
originalError.call(hash.context, xhr);
};
//Let ember-data's ajax method handle the call
this._super(url, type, hash);
}
});
我们在这里所做的基本上是推迟收到 401 的调用,并保留登录完成后再次调用的请求。模态的 ajax 调用具有从原始 ajax 调用的哈希应用到它的原始错误,因此只要定义了原始错误,原始错误仍然有效:-)
这是我们与我们自己的数据持久性库一起使用的东西的修改实现,因此您的实现可能会有所不同,但相同的概念应该适用于 ember-data。