Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度工厂变量赢得';t Update-实例获取旧值_Javascript_Angularjs - Fatal编程技术网

Javascript 角度工厂变量赢得';t Update-实例获取旧值

Javascript 角度工厂变量赢得';t Update-实例获取旧值,javascript,angularjs,Javascript,Angularjs,我有一个资源工厂,它构建用于访问API的对象。我使用一个环境变量来确定URL的基本部分——当管理员用户“参与”客户帐户时,是否包括“帐户/id”路径段 保存“engagedAsId”的sessionStorage项不会被读取,不过对于在使用帐户后创建的实例。它需要完全重新加载应用程序才能获取更改。以下是工厂代码: myapp.factory('ResourceSvcFactory', ['$rootScope', '$resource', function ($rootScop

我有一个资源工厂,它构建用于访问API的对象。我使用一个环境变量来确定URL的基本部分——当管理员用户“参与”客户帐户时,是否包括“帐户/id”路径段

保存“engagedAsId”的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中的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
}]);