这两种定义工厂的方式之间有什么区别

时间:2017-03-13 13:24:18

标签: angularjs

.factory("user", userService);
  function userService($q, $http) { 
    function User (){
    //....
    }
    return User;
  }

.factory("User", ["$q", "$http", function ($q, $http) {
  var User = {
  //....
  }
  return User;
}])

我经常看到两者都取决于情况(或者更确切地说取决于作者),但我现在已经想了很长时间(因为我已经开始学习Angular),是什么让它与众不同,如果我可以使用其中一个而不改变任何东西。我通常使用第一个并遵循逻辑,因为我发现它更容易,因为我与第二个相混淆。我可能犯了错误,但这就是为什么我要求一些帮助。
谢谢!

2 个答案:

答案 0 :(得分:1)

您问题中的第二个代码段是我建议您用于所有angularjs服务的代码段。

Angular框架提供开箱即用的依赖注入(DI)功能,可在定义组件(如服务,指令,过滤器,动画)或为模块提供运行和配置块时使用。

如果您在角度应用中不使用字符串数组来定义依赖项,那么您做错了。这种注册依赖项的方法适用于JavaScript源文件的非缩小版本。

但是如果你打算缩小生产的文件,每个人都必须这样做,那么所有那些(依赖)参数将被改为一些非常随机的东西,哪些角度将无法映射到任何注册的组件。所以最终,框架会抛出一个错误。

为了避免这个错误,我们可以确保始终使用类型字符串数组来指示依赖项。 Read this in more detail。如果您是自己的,那么您可以记住这个提示。但是,如果在团队中工作,最好使用以下选项对其进行配置,以便团队中的每个人都遵循此规则。如果没有,那么他们将遇到错误。

我建议你使用严格的DI模式。

如何启用严格模式? 可以使用下面提到的两个选项启用此模式。

方法-1:

<div ng-app="myApp" ng-strict-di>
  <!-- your app here -->
</div>

方法-2:

angular.bootstrap(document, ['myApp'], {
  strictDi: true
});

Learn why is strict DI mode good for your AngularJS app in my blog post.

答案 1 :(得分:0)

第一种形式不适用于缩小。使用缩小时需要第二种形式。原因是AngularJS注入器使用函数参数名称来解析第一种形式的$q$http依赖项。如果功能参数名称被更改(例如,通过缩小),那将失败。第二种形式依赖于字符串"$q""$http",这些字符串不会因缩小而改变。

这在step 7 of the AngularJS tutorial中进行了讨论。