mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-05-28 07:57:11 +08:00
Introduced injector and $new to scope, and injection into link methods and controllers
- added angular.injector(scope, services, instanceCache) which returns inject
- inject method can return, instance, or call function which have $inject
property
- initialize services with $creation=[eager|eager-publish] this means that
only some of the services are now globally accessible
- upgraded $become on scope to use injector hence respect the $inject property
for injection
- $become should not be run multiple times and will most likely be removed
in future version
- added $new on scope to create a child scope
- $inject is respected on constructor function
- simplified scopes so that they no longer have separate __proto__ for
parent, api, behavior and instance this should speed up execution since
scope will now create one __proto__ chain per scope (not three).
BACKWARD COMPATIBILITY WARNING:
- services now need to have $inject instead of inject property for proper
injection this breaks backward compatibility
- not all services are now published into root scope
(only: $location, $cookie, $window)
- if you have widget/directive which uses services on scope
(such as this.$xhr), you will now have to inject that service in
(as it is not published on the root scope anymore)
This commit is contained in:
@@ -1,11 +1,27 @@
|
||||
describe('scope/model', function(){
|
||||
|
||||
var temp;
|
||||
|
||||
beforeEach(function() {
|
||||
temp = window.temp = {};
|
||||
temp.InjectController = function(exampleService, extra) {
|
||||
this.localService = exampleService;
|
||||
this.extra = extra;
|
||||
this.$root.injectController = this;
|
||||
};
|
||||
temp.InjectController.$inject = ["exampleService"];
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
window.temp = undefined;
|
||||
});
|
||||
|
||||
it('should create a scope with parent', function(){
|
||||
var model = createScope({name:'Misko'});
|
||||
expect(model.name).toEqual('Misko');
|
||||
});
|
||||
|
||||
it('should have $get/set$/parent$', function(){
|
||||
it('should have $get/$set/$parent', function(){
|
||||
var parent = {};
|
||||
var model = createScope(parent);
|
||||
model.$set('name', 'adam');
|
||||
@@ -138,40 +154,6 @@ describe('scope/model', function(){
|
||||
});
|
||||
});
|
||||
|
||||
describe('service injection', function(){
|
||||
it('should inject services', function(){
|
||||
var scope = createScope(null, {
|
||||
service:function(){
|
||||
return "ABC";
|
||||
}
|
||||
});
|
||||
expect(scope.service).toEqual("ABC");
|
||||
});
|
||||
|
||||
it('should inject arugments', function(){
|
||||
var scope = createScope(null, {
|
||||
name:function(){
|
||||
return "misko";
|
||||
},
|
||||
greet: extend(function(name) {
|
||||
return 'hello ' + name;
|
||||
}, {inject:['name']})
|
||||
});
|
||||
expect(scope.greet).toEqual("hello misko");
|
||||
});
|
||||
|
||||
it('should throw error on missing dependency', function(){
|
||||
try {
|
||||
createScope(null, {
|
||||
greet: extend(function(name) {
|
||||
}, {inject:['name']})
|
||||
});
|
||||
} catch(e) {
|
||||
expect(e).toEqual("Don't know how to inject 'name'.");
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe('getterFn', function(){
|
||||
it('should get chain', function(){
|
||||
expect(getterFn('a.b')(undefined)).toEqual(undefined);
|
||||
@@ -215,4 +197,27 @@ describe('scope/model', function(){
|
||||
});
|
||||
});
|
||||
|
||||
describe('$new', function(){
|
||||
it('should $new should create new child scope and $become controller', function(){
|
||||
var parent = createScope(null, {exampleService: function(){return 'Example Service';}});
|
||||
var child = parent.$new(temp.InjectController, 10);
|
||||
expect(child.localService).toEqual('Example Service');
|
||||
expect(child.extra).toEqual(10);
|
||||
|
||||
child.$onEval(function(){ this.run = true; });
|
||||
parent.$eval();
|
||||
expect(child.run).toEqual(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('$become', function(){
|
||||
it('should inject properties on controller defined in $inject', function(){
|
||||
var parent = createScope(null, {exampleService: function(){return 'Example Service';}});
|
||||
var child = createScope(parent);
|
||||
child.$become(temp.InjectController, 10);
|
||||
expect(child.localService).toEqual('Example Service');
|
||||
expect(child.extra).toEqual(10);
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user