首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AngularJS中的可选依赖项

AngularJS中的可选依赖项
EN

Stack Overflow用户
提问于 2013-08-31 05:56:40
回答 4查看 22.8K关注 0票数 53

我正在尝试用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();
    }

}]);
EN

回答 4

Stack Overflow用户

发布于 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');
        }
    }
]);
票数 60
EN

Stack Overflow用户

发布于 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
});

Demo link

票数 13
EN

Stack Overflow用户

发布于 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');
    }
});
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18542032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档