我有一个资源工厂,用于构建用于访问API的对象。我使用环境变量来确定URL的基本部分 - 是否包含' account / id'管理员用户“参与”时的路径段客户帐户。
持有' engageAsId'的sessionStorage项目。虽然对于在使用帐户后创建的实例,但不会被阅读。它需要完全重新加载应用程序以获取该更改。这是工厂代码:
myapp.factory('ResourceSvcFactory',
['$rootScope', '$resource',
function ($rootScope, $resource) {
function ResourceSvcFactory (endpoint) {
// vvv problem is here vvv
var accountId = sessionStorage.getItem('engagedAsId');
var apiPath = (accountId != null)
? '/api/account/' + accountId + endpoint
: '/api' + endpoint;
var Resource = $resource(apiPath+':id/',{
// default params
id:''
},{
// custom actions
update: {method: 'PUT'}
});
return Resource;
}
return ResourceSvcFactory;
}]);
myapp.factory('AssetsResource', ['ResourceSvcFactory', function (ResourceSvcFactory) {
var endpoint = '/assets/';
var Resource = ResourceSvcFactory(endpoint);
return Resource;
}]);
我在我的控制器中实现了这个:
myapp.controller('AssetGroupListCtrl', [ 'AssetgroupsResource', function (AssetgroupsResource) {
var AssetGroups = AssetgroupsResource;
// ... rest of controller
}]);
当我运行它时它工作正常。但是,如果我在没有完全重新加载的情况下更改sessionStorage中的参与状态,则控制器中的实例不会获取新路径。
有没有办法刷新'实例? ...自动?
答案 0 :(得分:1)
经过数小时的研究,似乎我在问题中尝试做的根本缺陷是:我试图使用“单身人士”。作为一个班级'。来自文档:
注意:Angular中的所有服务都是单例。这意味着进样器最多使用一次配方来创建对象。然后,注射器缓存该参考以满足未来的所有需求。 http://docs.angularjs.org/guide/providers
我的工作是在返回对象的方法中创建$ resource。这是一个例子: MyApp.factory(' AssetgroupsResource&#39 ;, [' $ rootScope',' $ resource', function($ rootScope,$ resource){
return {
init: function () {
var accountId = sessionStorage.getItem('engagedAsId');
var apiPath = (accountId != null)
? '/api/account/' + accountId + endpoint
: '/api' + endpoint;
// default params
id:''
},{
// custom actions
});
return Resource;
}
}
}]);
这使得可以在控制器中的正确时间构建对象:
MyApp.controller('AssetGroupListCtrl', ['Assetgroups', function (Assetgroups) {
var Assetgroups = AssetgroupsResource.init();
// now I can use angular's $resource interface
}]);
希望这有助于某人。 (或者你告诉我这一切都可以用3行完成!)
答案 1 :(得分:0)
您可以随时致电$scope.$apply();
强制进行角度勾选。
在这里查看一个很好的教程:http://jimhoskins.com/2012/12/17/angularjs-and-apply.html
答案 2 :(得分:0)
我认为$resource
使用的承诺可能是一个问题,具体取决于您在控制器中实现工厂的方式。
$scope.$apply()
可能会返回错误。确保角度刻度的更好方法是$rootScope.$$phase || $rootScope.$apply();
。