Angular Factory变量不会更新 - 实例获得旧值

时间:2014-03-11 21:41:31

标签: javascript angularjs

我有一个资源工厂,用于构建用于访问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中的参与状态,则控制器中的实例不会获取新路径。

有没有办法刷新'实例? ...自动?

3 个答案:

答案 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();