Page 186 - AngularJS权威教程
P. 186
166 第 16 章 XHR 实践
下面的配置会改变全局的Restangular对象。如果我们想将设置封装起来,针对单
个数据库进行配置,就需要创建一个服务,将自定义的Restangular对象封装起来。
首先设置API密钥,鉴于这个密钥在整个应用中都是不变的,可以将它设置成常量。
angular.module('myApp', ['restangular'])
.constant('apiKey', 'YOUR_API_KEY');
现在这个API密钥可以被注入到应用的任何部分当中。接下来在模块的config()代码块中进
行设置。
为了使用MongoLab,需要将baseUrl设置成API的切入点:
//...
.config(function(RestangularProvider,apiKey) {
RestangularProvider
.setBaseUrl('https://api.mongolab.com/api/1/databases/YOURDB/collections');
});
接下来,任何发送给后端数据库的请求都需要设置API密钥。通过Restangular的setDefault
RequestParams()方法可以方便地进行设置:
//...
.config(function(RestangularProvider,apiKey) {
//...
RestangularProvider
.setDefaultRequestParams({
apiKey: apiKey
});
});
接下来需要更新Restangular中的字段映射,将MongoDB的_id.$oid字段映射到Restangular
的id字段上。通过setRestangularFields()函数可以方便地实现这个需求:
//...
.config(function(RestangularProvider,apiKey) {
//...
RestangularProvider.setRestangularFields({
id: '_id.$oid'
});
});
最后需要覆盖_id字段,这个字段是MongoDB在更新记录时设置的。Mongo不允许覆盖_id
字段,所以我们通过Restangular来模拟这个过程。鉴于Restangular会调用路由来更新元素,我们
不需要担心对象无法被覆盖。
.config(function(RestangularProvider,apiKey) {
//...
RestangularProvider.setRequestInterceptor(function(elem, operation, what) {
if (operation === 'put') {
elem._id = undefined;
return elem;
}
return elem;
});
});