我试图在跨多个页面使用的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();
}
}]);
不,Angular还不支持现成的可选依赖项。您最好将所有依赖项放入一个模块中,并将其作为一个Javascript文件加载。如果需要另一组依赖项,请考虑在另一个JS中创建另一个模块,并将所有公共依赖项放到公共JS中。
但是,您描述的行为可以通过$injector
service实现。您只需将$injector
所有依赖项注入到控制器中,然后手动将其从依赖项中拉出,以检查它们是否存在。而已:
index.html:
<!DOCTYPE html>
<html data-ng-app="myApp">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js"></script>
<script src="app.js"></script>
<script src="1.js"></script>
<script src="2.js"></script>
<title>1</title>
</head>
<body data-ng-controller="DemoController">
</body>
</html>
app.js:
var myApp = angular.module('myApp', []);
myApp.service('commonService', function(){
this.action = function(){
console.log('Common service is loaded');
}
});
myApp.controller('DemoController', ['$scope', '$injector', function($scope, $injector){
var common;
var first;
var second;
try{
common = $injector.get('commonService');
console.log('Injector has common service!');
}catch(e){
console.log('Injector does not have common service!');
}
try{
first = $injector.get('firstService');
console.log('Injector has first service!');
}catch(e){
console.log('Injector does not have first service!');
}
try{
second = $injector.get('secondService');
console.log('Injector has second service!');
}catch(e){
console.log('Injector does not have second service!');
}
if(common){
common.action();
}
if(first){
first.action();
}
if(second){
second.action();
}
}]);
1.js:
myApp.service('firstService', function(){
this.action = function(){
console.log('First service is loaded');
}
});
2.js:
myApp.service('secondService', function(){
this.action = function(){
console.log('Second service is loaded');
}
});
看到它活在这pl!尝试使用<script>
标签并注意控制台输出。
PS而且,正如@Problematic所说,您可以$injector.has()
从AngularJS 1.1.5开始使用。
主要内容:排除依赖,可选依赖,排除依赖 VS 可选依赖 我们知道 Maven 依赖具有传递性,例如 A 依赖于 B,B 依赖于 C,在不考虑依赖范围等因素的情况下,Maven 会根据依赖传递机制,将间接依赖 C 引入到 A 中。但如果 A 出于某种原因,希望将间接依赖 C 排除,那该怎么办呢?Maven 为用户提供了两种解决方式:排除依赖(Dependency Exclusions)和可选依赖(Optional Dependencies)。 排除依赖
我正在使用OSGI felix平台中的SCR框架在我的组件中注入服务引用。除了可选的依赖项外,这非常有效。因此,如果我有两个组件Foo和Bar,其中Foo如下所示: 只要定义Bar接口的捆绑包部署在我的OSGi平台中,这就可以工作。如果平台中没有激活Bar实现组件,SCR仍然很高兴,并将激活我的FoImpl组件,当然无需参考任何Bar实现。但是,如果Bar接口未部署在平台中,SCR在激活组件期间崩
主要内容:什么是依赖注入,value,factory,provider,constant,实例,AngularJS 实例 - factory,AngularJS 实例 - provider什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或者通过引用传递)到一个独立的对象(或客户端)中,然后成为了该客户端状态的一部分。 该模式分离了客户端依赖本身行为的创建,这使得程序设计变得松耦
问题内容: 我想知道接下来的两行之间是否有区别,为什么要使用其中之一(这两行按预期工作) 我是从AngularJS官方教程中获得的,我知道有关于此修改的解释,但我不理解它…… http://docs.angularjs.org/tutorial/step_05 提前致谢! 问题答案: 如果缩小第一行,则会得到: 依赖注入将无法再工作,因为角度不知道什么和有。比较一下以缩小第二个版本: 该函数的参数
在Spring DI中,将autowired字段声明为可选字段可以使客户端不向其注入任何值。使用Java EE的CDI是否可能做到这一点?我试过可选但失败了。我想知道是否有一个等价的机制我可以使用。 下面是我尝试的: 我得到一个错误消息:线程“main”org.jboss.weld.exceptions.deploymentexception:WELD-001408在注入点[[BackedAnno
使用STS点击pom.xml文件时,我可以查看这些选项卡 如何使用intelliJ IDEA,特别是依赖层次结构来查看所有这些选项卡?我试图通过右键单击pom来查看它。xml