2015-04-02 215 views
0

我有問題相關的AngularJS依賴注入和他們之間的時間。這裏是我的代碼和錯誤AngularJS依賴注入時序問題

var module = angular.module('Demo', []); 

module.factory('demo', function() { 
     return { 
      data: {}, 
     }; 
    }); 

module.provider('foo', ['demo', function(demo) { 
    console.log(demo); 

    this.$get = function() { 
    }; 
}]); 

錯誤:

Uncaught Error: [$injector:modulerr] Failed to instantiate module Demo due to: 
Error: [$injector:unpr] Unknown provider: demo 

但是,如果我在最後一個定義添加的setTimeout一切工作正常,但它的黑客代碼它不應該是這樣的。

var module = angular.module('Demo', []); 

module.factory('demo', function() { 
     return { 
      data: {}, 
     }; 
    }); 
setTimeout(function(){ 
module.provider('foo', ['demo', function(demo) { 
    console.log(demo); 

    this.$get = function() { 
    }; 
}]); 

}); 

這裏是小提琴問題: http://jsfiddle.net/zcf7rb4s/1/

回答

1

不能添加demo作爲一個依賴那裏,因爲它還不存在。這就是$injector的工作方式。您可以做的是將demo列爲提供者的$get函數的依賴項。在所有提供者已被定義之後,將執行$injector

檢查this

<div ng-app="Demo"> 
    <div ng-controller="test">{{x}}</div> 
</div> 

而且定義:

var module = angular.module('Demo', []); 

module.factory('demo', function() { 
     return { 
      data: {x: 'x'}, 
     }; 
    }); 

module.provider('foo', function() { 
    this.$get = function(demo) { 
     return { 
      demo: demo 
     }; 
    }; 
}); 

module.controller('test', ['$scope', 'foo', function($scope, foo) { 
    $scope.x = foo.demo.data.x; 
}]); 

的工廠和供應商中的代碼在 「第1步」 運行。 然後,在「步驟2」中,AngularJS綁定控制器。它首先使用$injector來注入依賴關係(以前在「步驟1」中已經定義)。所以在實踐中你的$timeout「模擬」這種行爲,這就是它的工作原理。但是這是錯誤的,那不是你應該使用它們的方式。

0

注入提供這樣反而:

module.provider('foo', function() { 
    this.$get = ['demo', function(demo) { 
     console.log(demo); 
    }]; 
});