我有一个dijit.form.FilteringSelect,使用dojo.store.JsonRest实例作为商店。
我对商店的后端服务从其他需要身份验证的地方获取数据。有时,此身份验证可能会失败,我想将其报告给浏览器。
返回的错误是JSON,响应是404,所以我可以在控制台中看到这个。但是,我似乎无法找到一种方法来挂钩,所以我可以通过FilteringSelect实例或通过JsonRest实例对它做一些有用的事情。
鉴于以下代码,我在哪里可以添加错误处理函数?
var store = new JsonRest({
target: "/json/store/",
idProperty: "InternalID"
});
var widget = new FilteringSelect({
id: 'widgetId',
store: store,
searchAttr: 'name'
}, 'widgetId'
});
正在使用的Dojo版本是1.7.3。
答案 0 :(得分:1)
手动调用datastore.fetch()
或objectstore.query()
。默认情况下,一旦将其附加到选择 - 一旦选择打开/启动,它将触发.fetch()
。虽然手动执行此操作,但由于数据被缓存,因此您也可以更快地响应ui。
由于未定义,查询将是通配符 - 尽管也可以在fetch配置对象中指定(如果需要最小代码段,仅用于验证成功的身份验证)。
两个api略有不同
var store = new DataStore({
url: "/json/store/datastore"
});
store.fetch({
onBegin: function(size, request) { },
onItem: function(item, request){ },
onComplete: function(items, request) { },
// youre looking for this hook
onError: function(error, request) { }
});
var store = new JsonRest({
target: "/json/store/",
idProperty: "InternalID"
});
store.query(/* url query parameters, none = all */).addBoth(
function(result) {
console.log('success', result);
},
function(status) {
console.log('error', status);
}
);
var widget = new FilteringSelect({
id: 'widgetId',
store: store,
searchAttr: 'name'
}, 'widgetId'
});
答案 1 :(得分:1)
我最终拦截了store.query返回的QueryResults,并使用适当的错误处理程序创建了我自己的Deferred。与FilteringSelect类似,我也不得不陷阱取消。
结果部分的代码在商店的定义之后,在FilteringSelect之前。
aspect.after(store, 'query', function(QueryResults) {
Deferred.when(QueryResults, function() {}, function(err) {
if (err.dojoType && err.dojoType == 'cancel') {
return; // ignore cancellations
}
// Do custom error handling here
});
return QueryResults;
});