module.value没有跨app更新和$ provide注入中断app

时间:2017-02-22 18:42:42

标签: javascript angularjs angularjs-scope

即使对我来说,这个问题也很混乱,所以我会尽可能地逐步尝试简化它。

1

我只需拨打angular.module('app', [])即可开始使用该应用。然后在同一设置中我添加一个值:

angular.module('app', []).value('Storage', {})

我将值设置为{},因为还没有要存储的内容。

2

我有一系列“init”控制器,以确保一切正确启动。在目录控制器内部,我想更新Storage值。

我处于严格模式,所以我的设置如下:

angular.module('app').controller('Init', InitController);

InitController.$inject = ['Storage', '$q', '$http'];

function InitController(Storage, $q, $http){
   var getDeferred = $q.defer();
   var got = getDeferred.promise;

   $http({
       // some code to do stuff
   }).then(function(data){
       getDeferred.resolve(data);   
   });
   got.then(function(data){

       // then I should I be able to update and set the new value here
       Storage = data; // thats what everything online showed me
   });
}

第3

我有我的主控制器,我正常注射以及诸如此类:

angular.module('app').controller('Main', MainController);
MainController.$inject = ['Storage'];
function mainController(Storage){
    console.log(Storage) // shows an empty object still
}

这没有用,所以我回到了第二步,并且很好地理解如果我使用$provide服务并以这种方式获得价值,这应该是正常的吗?

// Step 2 revised
angular.module('app').controller('Init', InitController);

InitController.$inject = ['$provide', '$q', '$http'];

function InitController($provide $q, $http){
   var getDeferred = $q.defer();
   var got = getDeferred.promise;

   $http({
       // some code to do stuff
   }).then(function(data){
       getDeferred.resolve(data);   
   });
   got.then(function(data){

       // tried to set it up a new way
       $provide.value('Storage', data);
   });
}

这只是直接崩溃了所有内容我得到了这个错误

Error: [$injector:unpr] http://errors.angularjs.org/1.5.7/$injector/unpr?p0=[object Object]rovideProvider%%3C-%%24provide%%3C-%CatalogInit

这几乎没有意义,因为我的所有依赖都在那里并拼写正确。所以我很茫然。谷歌一直没有帮助,因为一切都只是重复自我。

1 个答案:

答案 0 :(得分:0)

代码有拼写错误:

function InitController($provide $q, $http){

但主要问题是$provide不能在运行阶段使用。

虽然it is possible to use the services from config phase in run phase,但这会导致不可预见的情况。如果没有充分的理由,这应该被认为是黑客并且应该避免。

这取决于Storage的使用方式。它可能是路线解析器。或者应该保留对象的引用:

   got.then(function(data){
       angular.extend(Storage, data);
   });

如果Storage对象多次更改,则应首先清空它。