【问题标题】:How to separate angularjs files without using global scope如何在不使用全局范围的情况下分离 angularjs 文件
【发布时间】:2017-05-09 12:40:57
【问题描述】:

我已经看过这篇帖子 AngularJS best practices for module declaration? 但我仍然对声明和分离模块、控制器、服务等的 angularJS 文件的最佳方法感到有些困惑。

我知道将控制器和服务包装在 IIFE 中是一种很好的做法,因为它可以防止它们被超出范围使用。最好将控制器和模块分离到单独的文件中以进行组织。

我的问题是,如果我有一个控制器文件

我的Ctrl.js

(function(){
  "use strict";

  app.controller("myCtrl", ['$scope', function($scope) {
    $scope.firstName = "John";
    $scope.lastName = "Doe";
  }]);
})();

指令文件

myDirective.js

(function(){
  "use strict";
  app.directive("w3TestDirective", function() {
    return {
      template : "I was made in a directive constructor!"
    };
  });
})();

在自己的文件中声明模块的最佳做法是什么

myModule.js

是否应该将其保留在全局范围内,以便任何东西都可以按如下方式访问它:

var app = angular.module("myApp", []);

或者有没有办法将它包装在像 IIFE 这样的东西中,以使其不受全局范围的影响,但仍然可以被其他文件访问?

【问题讨论】:

    标签: javascript angularjs module declaration iife


    【解决方案1】:

    例如,我们可以在角度文件之间建立关系

    1. 控制器
    2. 服务
    3. 工厂
    4. 等等

    带角度模块

    例如: angular.module("myApp",["dependencies"])

    angular.module("myApp").controller("myCtrl",function(){}) 要么 angular.module("myApp").service("myservice",function(){})

    【讨论】:

      【解决方案2】:

      在控制器和指令中不需要 sn-ps IIFE,因为没有任何东西暴露在全局范围内。

      var app = ... 不应暴露在全局范围内。可以使用模块 getter:

      var app = angular.module("myApp")
      

      这需要保留加载的 JS 文件的顺序。模块应该先用angular.module("myApp", [])定义,然后才能定义模块单元。

      除非应用程序使用 JS 模块(AMD、CommonJS、ES6)来实现模块化,否则遵循“每个文件一个模块”模式是有益的。这可以显着提高可测试性,并且永远不会遇到与模块相关的竞争条件:

      (function(){
        "use strict";
      
        var app = angular.module("myApp.myCtrl", []);
      
        app.controller("myCtrl", ['$scope', function($scope) {
          $scope.firstName = "John";
          $scope.lastName = "Doe";
        }]);
      })();
      

      angular.module("myApp", ["myApp.myCtrl", "myApp.w3TestDirective"]);
      

      在这种情况下,加载模块文件的顺序无关紧要。

      【讨论】:

      • 所以一个文件有模块angular.module("myApp", ["myApp.myCtrl", "myApp.w3TestDirective"]);,一个文件有控制器或指令包裹在你展示的IIFE生活中,模块被分配给var app,就像你展示的那样?我想我仍然不明白为什么如果这样做,模块定义不会全球公开。
      • 因为它没有var app = angular.module(...)。如果您在 JS 文件的范围内没有 var ...function ...,则不会向全局范围公开任何内容。 Angular 的设计方式允许在不将任何内容暴露于全局范围的情况下编写应用程序,但是,为了可读性和一些 OOP 问题,将局部变量和函数包装在 IIFE 中可能是有益的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 2019-08-08
      • 1970-01-01
      • 2015-03-24
      • 2013-08-18
      • 2015-10-07
      • 2015-02-21
      相关资源
      最近更新 更多