Ⅰ angularjs怎么查看注入了什么依赖
依赖注入
依赖注入是软件设计模式中的一部分,用于处理组件是如何得到它说依赖的其它组件的。
Angular的注入器子系统(Angular是由多个系统组成)是负责创建组件,解决它们之间的依赖关系,并且根据它们的需要,给它们提供所需要的组件的实例。
使用依赖注入
依赖注入(DI)是贯通了整个angularjs的。当这个组件定义了,或者在mole的run方法config方法中定义了它们,你就可以在这个mole的任何地方使用这个组件了。
1、诸如:服务(service)、指令(directive)、过滤器(filter)和动画(animation)组件,都是通过注入器的工厂(factory)方法或者在构造函数中定义的。这些组件可以注入service"(服务) 或者 "value"(值)。
2、控制器(controller)就是使用构造函数的方式进行定义的。它可以注入service"(服务) 或者 "value"(值)。
3、run方法接收一个function函数,它里面可以注入服务(service)或者值(value)亦或常量(constant),然后可以被注入到需要它们的组件当中去(注意,这里可以定义一些常量哦!)。提示:在run中,你不能注入“provider”哦!
4、config方法接收一个function函数,它可以注入"provider" and "constant"(常量)。提示:在config方法中,你不可以注入"service"(服务) 或者 "value"(值)。
关于模块Moles的run方法和config方法的更多信息,请点击这里。
工厂(factory)方法
使用factory来定义指令(directive),服务(service)或者过滤器(filter)。factory方法是注册在mole(模块)下的。我们推荐你这样来定义factory:
12345678910angular.mole('myMole', []).factory('serviceId', ['depService', function(depService) {// ...}]).directive('directiveName', ['depService', function(depService) {// ...}]).filter('filterName', ['depService', function(depService) {// ...}]);模块儿(mole)的方法
我们可以指定方法在configuration(配置环境)下运行,也可以在mole(模块)的运行时,通过调用config方法和run方法来运行。
1234567angular.mole('myMole', []).config(['depProvider', function(depProvider) {// ...}]).run(['depService', function(depService) {// ...}]);控制器
我们推荐如下的方式来注册一个Controller:
1234567someMole.controller('MyController', ['$scope', 'dep1', 'dep2', function($scope, dep1, dep2) {...$scope.aMethod = function() {...}...}]);不像服务一样,在应用程序中,相同的controller是可以有多个实例的哈。
依赖性的声明
在Angular中,调用一些方法都是使用注入的方式进行调用的,例如:service factory,controller。那么你就必须将它们所使用的组件给注入进去,以提供它们使用。有以下三种方式进行依赖关系的声明。
1、使用内联数组的声明方式
2、使用$inject属性来声明
3、隐式声明方式(不推荐,并且会有警告)
一、内联数组的声明方式
这是非常好的一种声明依赖性的方式。来一个例子:
123someMole.controller('MyController', ['$scope', 'greeter', function($scope, greeter) {// ...}]);我们使用一个数组,这个数组由两部分元素组成,一个用于声明依赖性的字符串集合和最后一个元素(这个元素是一个方法,用于自己的实现)。
二、$inject属性进行声明
直接上个例子:
12345varMyController = function($scope, greeter) {// ...}MyController.$inject = ['$scope', 'greeter'];someMole.controller('MyController', MyController);需要注意的是,$inject数组中的依赖,必须与MyController控制器中的参数一 一对应。
三、隐式声明
注意:如果你打算使用这种方式去运行代码,你的服务的名称可能会被重命名,服务也可能会在你的应用中被玩坏。
这是最简单的一种声明方式,你只要保证你的参数名称和依赖的组件名称能对得上。
123someMole.controller('MyController', function($scope, greeter) {// ...});在上面的例子当中,$scope服务和greeter服务会被注入到controller里面去。这种方式的一个好处就是少了依赖性声明的数组的存在。而且可以很自由的重新排列你的依赖性。
但是,这个方法在混淆和压缩后是没有发用的。是无法正常工作的。因为这些动作都会重命名你的参数。呃呃呃……
ng-annotate工具可以方便的让你在你的应用中使用这个隐式声明模式,因为它会在进行压缩或者混淆的时候自动把你的声明方式给改成我们推荐的内联方式进行声明,如果你想使用这种方式,可能你需要使用ng-strict-di(严格模式)。
正因为这种方式要使用严格模式,我们需要很小心,所以,一般我们都不会使用这种方式。
使用严格的依赖注入
你可以把ng-strict-di指令增加到ng-app指令所在的元素上,来使得你的应用使用的是严格模式。
1234567<!doctype html><html ng-app="myApp"ng-strict-di><body>I can add: {{ 1 + 2 }}.<script src="angular.js"></script></body></html>严格模式下,如果你尝试使用隐式方式来声明的时候,就会抛异常。
1234567angular.mole('myApp', []).factory('willBreak', function($rootScope) {// $rootScope is implicitly injected}).run(['willBreak', function(willBreak) {// Angular will throw when this runs(执行到这里会报错)}]);如果你是使用手动方式启动应用的话,你也可以这样来使用严格模式:
123angular.bootstrap(document, ['myApp'], {strictDi: true});Ⅱ angularjs的服务是单例对象是什么意思
服务的本质是一个单例对象,既然是一个js对象,那么它肯定有属性和方法。
当我们把服务注入到控制器中时,我们就可以调用服务,也就是一个js对象的属性和方法了。
这样理解起来是不是很简单,所谓地调用一个服务,其实就是使用一个js对象的属性或方法。
最常见的注册服务的方法是factory()方法。
factory(name,function(){
return{
};
})
它包含两个参数:
1、name
2、一个函数
name是用来注册这个服务的名称,function中会返回一个对象或者函数。这点是不是和我们指令的注册方法十分相似呢,
是的他们都是用一个name来注册一个指令或者是服务的名称。然后用function返回一个对象。
其实,说白了就是用一个name来表示一个js对象。
然后指令调用指令这个js这个对象的时候,用的是html中的标签来调用。而调用服务这个js对象时,是在controller中用服务的名字来实现服务的调用。
我们来看一个controller中调用service的例子:
.controller("myController",function($scope,myService){
$scope.name = "kobe";
$scope.age = 39;
alert(myService.serviceName);
myService.serviceMethod();
})
.factory("myService", function(){
return{
serviceName:"testService",
serviceMethod:function()
Ⅲ angularjs怎么实现分页功能
1、插抄件源码主要基于angular directive来实现。
2、调袭用时关键地方是后台请求处理函数,也就是从后台取数据。
3、插件有两个关键参数currentPage、itemsPerPage,当前页码和每页的记录数。
4、实现方法调用后需要根据每次点击分页插件页码时重新提交后台来获取相应页码数据。 在调用的页码中使用了$watch来监控。 初次使用时是把调用函数放在了插件的onchange中,结果发现每次都会触发两次后台。这个地方需要注意。
5、我把请求后台封装成了Service层,然后在Controller里调用,也符合MVC思想
Ⅳ 怎么在angularjs的config中使用service
Angular中有几种不同类型的services。每一种都有自己的独特用法。
需要记住的非常重要的一点是service总是一个单体,无论是哪种类型的service。
注释:单体是一种设计模式,它限制了每一个类仅能够实例化为一个对象。无论我们在什么地方注入我们的service,将永远使用同一个实例。
例子:
app.constant('fooConfig',{
config1: true,
config2: "Default config2" });
Constant是一个非常有用的service,它经常被用来在指令中提供默认配置。因此如果你正在创建一个指令,并且你想要在给指令传递可选参数的同时进行一个默认配置,一个Constant就是一个好办法。
作为一个constant,我们放入其中的值将不会改变。Contant service 基本上回事一个基本类型的值或者是一个对象。
例子:
app.value('fooConfig',{
config1: true,
config2: "Default config2 but it can change" });
一个value service有点像是一个constant但是它是可以被改变的。它也经常被用在一个指令上面,来进行配置。一个value service有点像是一个factory service的缩小版,它经常用来保存值但是我们不能在其中对值进行计算。
我们可以使用angular对象的extend方法来改变一个value service:
app = angular.mole("app", []);
app.controller('MainCtrl', function($scope, fooConfig) { $scope.fooConfig = fooConfig;
angular.extend(fooConfig, {config3: "I have been extended"});
});
app.value('fooConfig', {
config1: true,
config2: "Default config2 but it can changes" });
例子:
app.factory('foo', function() { var thisIsPrivate = "Private"; function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
});
// or..
app.factory('bar', function(a) { return a * 2;
});
Factory service是最普遍使用的service。它同样也非常容易理解。
一个Factory是一个能够返回任何数据类型的service。对于你如何创建它并没有什么可选项,你仅仅需要在其中返回一些东西即可。
正如前面所说的,所有的service类型都是单体,因此如果我们在一个地方修改了foo.variable,其他的地方也会相应的发生改变。
例子:
app.service('foo', function() { var thisIsPrivate = "Private"; this.variable = "This is public"; this.getPrivate = function() { return thisIsPrivate;
};
});
Service service 和factory差不多。它们之间的区别在于service会接收一个构造器,因此当你第一次使用它的时候,它将会自动运行newFoo()来实例化一个对象。一定要记住如果你在其他的地方也使用了这个service,它将返回同一个对象。
事实上,上面的代码和下面的代码等价:
app.factory('foo2', function() { return new Foobar();
}); function Foobar() { var thisIsPrivate = "Private"; this.variable = "This is public"; this.getPrivate = function() { return thisIsPrivate;
};
}
Foobar是一个类,我们在首次使用它的时候在我们的factory中将它实例化然后将它返回。和service一样,Foobar将只会实例化一次然后下次当我们再次使用factory时它将返回同一个实例。
如果我们已经有了一个类,并且我们想将它用在service中,我们只需要编写如下的代码:
app.service('foo3',Foobar);
Provider是factory的加强版。事实上,上一个例子中的factory代码等价于下面的provider代码:
app.provider('foo', function() { return { $get: function() { var thisIsPrivate = "Private"; function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
}
};
});
一个provider中应当由一个$get函数,其中的内容就是我们想要注入我们应用中的部分,因此当我们将foo注入一个控制器时,我们实际上注入的是$get函数。
既然factory如此简单,那我们为什么还要使用provider呢?因为我们可以在config阶段配置一个provider。因此我们可以编写下面的代码:
app.provider('foo', function() { var thisIsPrivate = "Private"; return {
setPrivate: function(newVal) { thisIsPrivate = newVal;
}, $get: function() { function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
}
};
});
app.config(function(fooProvider) { fooProvider.setPrivate('New value from config');
});
在这里我们将thisIsPrivate移到了我们的$get函数的外面,然后我们创建了一个setPrivate来在一个config函数中修改thisIsPrivate。为什么我们需要这样做?这难道不比在factory中添加setter要容易吗?除此之外,还有另外一个原因。
我们想要注入一个特定的对象但是我们想要提供一种方式来根据我们的需求进行一些配置。例如:一个service包含了一个使用jsonp的资源,我们想要配置具体使用的URL,或者我们想要使用一个第三方的service比如restangular来允许我们根据我们的需求来进行配置。
要注意到我们在config函数中放入的是nameProvider而不是name。在这里,我们实际上还是对name进行配置。
看到这里我们其实已经意识到了我们已经在应用中进行过一些配置了,像是$routeProvider以及$locationProvider,两者分别用来配置我们的路由了html5模式。
那么现在已经决定要使用前面的 foo service,但是其中还是缺少一个你想要的greet函数。你可以修改factory吗?答案是不行!但是你可以装饰它:
app.config(function($provide){ $provide.decorator('foo',function($delegate){ $delegate.greet = function(){ return "Hello, I am a new function of 'foo'";
}
});
});
$provide是Angular用来在内部创建我们的service的东西。如果我们想要使用它的话可以手动来使用它或者仅仅使用在我们的模块中提供的函数(我们需要使用$provide来进行装饰)。$provide有一个函数,decorator,它让我们可以装饰我们的service。它接收我们想要装饰的service的名字并且在回调函数中接收一个$delegate来代表我们实际上的service实例。
在这里我们可以做一切我们想要的事情来装饰我们的service。在上面的例子中,我们为我们原来的service添加了一个greet函数。接着我们返回了修改后的service。
经过修改以后,现在我们的factory中已经有了一个叫做greet的函数。
装饰一个service的能力是非常实用的,尤其是当我们想要使用第三方的service时,此时我们不需要将代码复制到我们的项目中,而只需要进行一些修改即可。
注意:constant service不能被装饰。
我们的services都是单体但是我们可以创建一个单体factory来创建新的实例。在你深入之前,记住Angular中的服务都是单体并且我们不想改变这一点。但是,在极少数的情况下你需要生成一个新的实例,你可以像下面这样做:
function Person(json){ angular.extend(this,json);
}
Person.prototype = {
update: function(){ this.name = "Dave"; this.country = "Canada";
}
};
Person.getById = function(id){ return new Person({
name: "Jesus",
country: "Spain" });
};
app.factory('personService',function(){ return {
getById: Person.getById
};
});
在这里我们创建了一个Person对象,它接收一些json数据来初始化对象。然后我们在我们的原型(原型中的函数可以被Person的实例所用)中创建了一个函数,并且在Person上直接创建了一个函数(就像是类函数一样)。
因此现在我们拥有了一个类函数,它将基于我们提供的id来创建一个新的Person对象,并且每一个对象都可以自我更新。现在我们仅仅需要创建一个能够使用它的service。
当每次我们调用personService.getById时,我们都在创建一个新的Person对象,因此你可以在不同的控制器中使用这个service,即便当factory是一个单体,它也能生成新的对象。
Service是Angular中最酷的特性之一。我们可以使用很多方法来创造它们,我们仅仅需要找到符合我们需求的方法然后实现它。