AngularJS中$injector.instantiate
,$injector.get
和$injector.invoke
之间有什么区别?
答案 0 :(得分:23)
鉴于以下服务:
app.service('myService', function ($q, $http) {
return {
q: $q,
http: $http
};
});
$ injector.get(name,[caller]);
返回所请求服务的实例。
$injector.get('myService');
// { q: $q, http: $http }
$ injector.invoke(fn,[self],[locals]);
调用提供的方法并从$ injector传递给定的参数。
$injector.invoke(function (myService, $http) {
console.log(myService); // { q: $q, http: $http };
console.log(this); // { v: 'im this!' };
console.log($http); // null
}, { v: 'im this!' }, { $http: null });
$ injector.instantiate(Type,[locals]);
创建给定Type的新实例。获取构造函数,然后使用构造函数注释中指定的参数调用新实例。
假设以下'类':
function Person (fName, lName, $http, $q) {
return {
first_name: fName,
last_name: lName,
http: $http,
q: $q
}
}
现在,如果我们想在控制器中创建 new Person,我们可以这样做:
app.controller('...', function ($injector) {
var $http = $injector.get('$http');
var $q = $injector.get('$q');
var p = new Person('kasper', 'lewau', $http, $q);
console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: $http, q: $q };
});
想象一下,Person
有大约20个依赖项,我们使用$injector.get
方法获取每个属性。
<强>繁琐! - 你需要保持你的参数&amp;参数同步。 唉
相反,你可以这样做:
app.controller('...', function ($injector) {
var p = $injector.instantiate(Person, {
fName: 'kasper',
lName: 'lewau'
});
console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: $http, q: $q };
});
并且 - 如果我们愿意,我们可以向.instantiate
调用提供 locals ,以覆盖实例化时内部$injector.get()
通常会获得的内容。
var p = $injector.instantiate(Person, {
fName: 'kasper',
lName: 'lewau'
}, { $http: 'Nothing!', $q: 'Nothing!' });
console.log(p); // { first_name: 'kasper', last_name: 'lewau', http: 'Nothing!', q: 'Nothing!' };
我希望这能解释三者之间的区别。如果您需要有关其差异的更多信息,我会推荐这些文章:
答案 1 :(得分:0)
Kasper Lewau答案的附加标记,因为我无法添加评论。
$ injector.invoke(fn,[self],[locals],[serviceName]);
$ injector.instantiate(Type,[locals]);