我正在使用 AngularJS 的 $resource 来获取和更新一个对象。为了节省页面加载的往返行程,我将 JSON 对象放在页面上的一个变量中。如何使用这些数据初始化 $resource 而不是调用 $get?
问问题
5830 次
4 回答
6
您可以使用new
以下方法创建资源实例$resource
:
window.somePreloadedJson = {
id: 1,
name: 'lancelot',
quest: 'holy grail',
color: 'blue',
};
app.factory('myResource', function($resource) {
return $resource('/my/fake/:id', { id: '@id' });
});
...
$scope.resource = new myResource(window.somePreloadedJson);
这是 jsFiddle 上此技术的一个示例,它演示了$save
,$delete
等在创建的实例上按预期工作。(添加了一些调试代码来注销 HTTP 请求,而不是实际发出请求,因此您可以看到页面中会发出哪些请求。)
于 2013-01-30T05:55:08.467 回答
1
您可以使用此处angular-mocks.js
提供的脚本。该脚本允许您在运行时拦截服务调用并替换响应,这对于测试目的非常有用。
例如,给定一个服务:
app.factory('MyService', ['$resource', function($resource) {
return $resource('http://myservice/service', {}, {
get: {
method:'GET',
params:{},
isArray:false
}
});
}]);
可以这样重定向:
app.config(function($provide) {
$provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
});
app.run(function($httpBackend) {
$httpBackend.whenGET(new RegExp(".*/myservice/service.*")).respond(200, mockData.fake);
...
}
模拟数据在这样的地方定义:
var mockData = new Object();
mockData.fake = ...
要激活虚假服务,只需包含 angular-mocks 脚本和上述定义,切换到普通服务只需注释掉或删除它们。
于 2013-01-30T07:24:23.167 回答
1
没有更好的答案让我感到非常沮丧。这是我的解决方案。我不知道它是否符合蹩脚的条件,但它对我有用:
# Loading json data from the document into angular seems to be a pain.
# The sole purpose of this controller is to make that easier.
# Let's say you want to load up the following JSON: [{"name": "Joe", "id": 1}]
# AND you have an angularjs service called People with a list
# You would do the following:
# <any_element ng-controller='JsonDataController' data-json='[{"name": "Joe", "id": 1}]' data-service='People' data-binding='list'></any_element>
# The controller would then set People.list = JSON.parse($attrs.json)
# And that's all there is to it.
window.JsonDataController = ['$scope', '$attrs', '$injector', ($scope, $attrs, $injector) ->
service = $injector.get($attrs.service)
attributeName = $attrs.binding
service[attributeName] = JSON.parse($attrs.json)
]
于 2013-02-08T00:53:02.170 回答
1
您可以使用自定义 $cacheFactory 使用数据初始化 $resource。
假设您有:
window.initData = {
'/request1': 'a',
'/request2': [1, 2, 3],
'/request3': {c: 'c', d: 'd'}
};
首先,创建自定义缓存工厂:
angular.module('app').factory('PreloadedCache', function($cacheFactory, $window) {
var PreloadedCache = $cacheFactory('preloadedCache');
// Pre-populating the $resource cache
angular.forEach($window.initData, function(item, key) {
PreloadedCache.put(key, item);
});
// Overwrite the put cache function - prevent saving in two places
PreloadedCache.put = function() {};
return PreloadedCache;
});
然后,在资源操作上声明一个缓存属性(来自文档):
cache - {boolean|Cache} - 如果为真,默认的 $http 缓存将用于缓存 GET 请求,否则如果使用 $cacheFactory 构建的缓存实例,此缓存将用于缓存。
{action1: {method:?, params:?, cache: PreloadedCache, ...},
action2: {method:?, params:?, isArray:?, headers:?, cache: PreloadedCache, ...},
...}
于 2015-06-15T14:25:54.877 回答