Javascript 角度工厂变量赢得';t Update-实例获取旧值
我有一个资源工厂,它构建用于访问API的对象。我使用一个环境变量来确定URL的基本部分——当管理员用户“参与”客户帐户时,是否包括“帐户/id”路径段 保存“engagedAsId”的sessionStorage项不会被读取,不过对于在使用帐户后创建的实例。它需要完全重新加载应用程序才能获取更改。以下是工厂代码:Javascript 角度工厂变量赢得';t Update-实例获取旧值,javascript,angularjs,Javascript,Angularjs,我有一个资源工厂,它构建用于访问API的对象。我使用一个环境变量来确定URL的基本部分——当管理员用户“参与”客户帐户时,是否包括“帐户/id”路径段 保存“engagedAsId”的sessionStorage项不会被读取,不过对于在使用帐户后创建的实例。它需要完全重新加载应用程序才能获取更改。以下是工厂代码: myapp.factory('ResourceSvcFactory', ['$rootScope', '$resource', function ($rootScop
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中的engaged状态,则控制器中的实例不会拾取新路径
有没有办法“刷新”实例。。。自动?您始终可以调用
$scope.$apply()代码>强制进行角度刻度
这里有一个不错的教程:我认为$resource
使用promise,这可能是一个问题,具体取决于您如何在控制器中实现工厂
$scope.$apply()
如果使用不当,可能会返回错误。确保角度刻度的更好方法是$rootScope.$$phase | |$rootScope.$apply()代码> 经过数小时的研究,我试图在这个问题上做的基本缺陷似乎是:我试图用“单身”作为“类”。从文档中:
注:Angular中的所有服务均为单例服务。这意味着注入器最多使用每个配方一次来创建对象。然后,喷油器缓存参考,以备将来需要。
我的工作是在返回对象的方法中创建$resource。以下是一个例子:
MyApp.factory('AssetgroupsResource',
[“$rootScope”,“$resource”,
函数($rootScope$resource){
这使得在控制器中的正确时间构建对象成为可能:
MyApp.controller('AssetGroupListCtrl', ['Assetgroups', function (Assetgroups) {
var Assetgroups = AssetgroupsResource.init();
// now I can use angular's $resource interface
}]);
希望这对某人有所帮助。(或者你会告诉我这一切是如何在3行中完成的!)有几个答案指向$scope。$apply()方法,它似乎解决了重新评估代码块的需要。但是,问题发生在多个路由更改上,这些更改可能已经开始$apply循环。$apply错误,如果我在控制器b/c中创建实例之前调用它,它已经处于摘要循环中。很明显,工厂中的代码是o只在多个摘要中运行一次。它构建$resource并在每次调用时返回该结果。我需要的是它返回“builder”,以便每次都返回“builder”,从而创建新的对象。(现在大声思考…)
MyApp.controller('AssetGroupListCtrl', ['Assetgroups', function (Assetgroups) {
var Assetgroups = AssetgroupsResource.init();
// now I can use angular's $resource interface
}]);