$ injector.instantiate在angularjs中VS $ injector.get VS $ injector.invoke

时间:2015-07-12 12:41:57

标签: angularjs

AngularJS中$injector.instantiate$injector.get$injector.invoke之间有什么区别?

2 个答案:

答案 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]);

  • 可以用于任何函数:类构造函数与否(它内部有自动检查)
  • '自我'param仅用于纯函数。

$ injector.instantiate(Type,[locals]);

  • 只能用于类构造函数,否则它将构造空对象{}