我正在尝试用AngularJS实现一个可以跨多个页面使用的控制器。它利用了一些服务。它们中的一些会加载到所有页面上,有些则不会。我的意思是它是在不同的文件中定义的,并且这些文件是独立加载的。但是如果我没有在所有页面上加载这些服务,我会得到错误:
Error: Unknown provider: firstOtionalServiceProvider <- firstOtionalService
因此,我需要在所有页面上加载脚本。我可以在Angular中将依赖声明为可选吗?例如:
myApp.controller('MyController', ['$scope', 'firstRequiredService', 'secondRequiredService', 'optional:firstOptionalService', 'optional:secondOptionalService', function($scope, firstRequiredService, secondRequiredService, firstOptionalService, secondOptionalSerivce){
// No need to check, as firstRequiredService must not be null
firstRequiredService.alwaysDefined();
// If the dependency is not resolved i want Angular to set null as argument and check
if (firstOptionalService) {
firstOptionalService.mayBeUndefinedSoCheckNull();
}
}]);
发布于 2013-08-31 06:04:40
显然没有使用自动注射。但是,您可以注入注入器并检查服务:
myApp.controller('MyController', [
'$scope', '$injector', 'firstRequiredService', 'secondRequiredService',
function ($scope, $injector, firstRequiredService, secondRequiredService) {
if ($injector.has('firstOptionalService')) {
var firstOptionalService = $injector.get('firstOptionalService');
}
}
]);
发布于 2013-08-31 06:12:20
我可能会同意@Proplematic的建议,使用$injector。但是,我可以想到另一种解决方案:在引导文件中使用默认值(例如null
)注册所有服务。当加载其他文件时,以后的定义将覆盖默认定义,从而在某种程度上创建所需的效果。
var app = angular.module('plunker', []);
app.value("service1", null)
.value("service2", null)
.factory("service1", function() { return "hello"; });
app.controller('MainCtrl', function($scope, service1, service2) {
console.log(service1); // hello
console.log(service2); // null
});
发布于 2014-03-04 21:46:25
我是这样解决这个问题的:
var deps = [];
try {
//Check if optionalModule is available
angular.module('app').requires.push('optionalModule');
deps.push('optionalModule');
} catch(e){
console.log("Warn: module optionalModule not found. Maybe it's normal");
}
angular.module('app', deps).factory('stuff', function($injector) {
var optionalService;
if($injector.has('optionalService')) {
optionalService = $injector.get('optionalService');
} else {
console.log('No waffles for you, dear sir');
}
});
https://stackoverflow.com/questions/18542032
复制相似问题