FilteringSelect和JsonRest的错误处理

时间:2012-07-16 01:50:57

标签: dojo dijit.form

我有一个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。

2 个答案:

答案 0 :(得分:1)

手动调用datastore.fetch()objectstore.query()。默认情况下,一旦将其附加到选择 - 一旦选择打开/启动,它将触发.fetch()。虽然手动执行此操作,但由于数据被缓存,因此您也可以更快地响应ui。

由于未定义,查询将是通配符 - 尽管也可以在fetch配置对象中指定(如果需要最小代码段,仅用于验证成功的身份验证)。

两个api略有不同

with DataStore

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) { }
});

或使用JsonRest(OP的请求)

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;
});