【问题标题】:Visual Studio's AngularJS Template ExplainedVisual Studio 的 AngularJS 模板解释
【发布时间】:2018-06-07 23:51:39
【问题描述】:

当我使用 VS2015 模板创建新控制器时,我得到以下代码:

(function () {
    'use strict';

    angular
        .module('app')
        .controller('controller', controller);

    controller.$inject = ['$scope']; 

    function controller($scope) {
        $scope.title = 'controller';

        activate();

        function activate() { }
    }
})();

问题:

  1. 为什么 VS 模板将代码包装在自调用函数中?

  2. activate() 函数是怎么回事?我想在里面写什么代码,为什么我需要一个单独的函数而不是在控制器里面写代码?

  3. controller.$inject = ['$scope']; 视为一种更好的做法,然后将依赖项写入数组(作为控制器函数的参数)。

【问题讨论】:

    标签: angularjs visual-studio-2015 angularjs-controller angularjs-injector self-invoking-function


    【解决方案1】:

    为什么VS模板将代码包装在一个自调用函数中?

    因为它可以防止破坏全局命名空间。在这种情况下,controller 将在没有 IIFE 的情况下成为全局命名空间的成员。

    activate() 函数是怎么回事?

    它有助于分离控制器变量和代码的声明和执行。在调用activate函数之前,我们通常使用this.语法将所有依赖声明为控制器成员。

    您将在activate 函数中编写执行代码。

    controller.$inject = ['$scope']; 被认为是更好的做法吗?

    其实是的!它可以帮助您将控制器定义与其对应的角度分开。它可以帮助您避免在 angular.module( ... ).controller 块中编写整个控制器代码,以提高代码的可读性。

    编辑 1

    如果没有 IIFE,名为 controller 的函数将成为全局命名空间的成员,并且可以在整个页面中访问。它还可能会被后续代码覆盖。不要将 AngularJS 与此混合,因为这是 JavaScript 所做的。

    activate 函数只是分离关注点的一层。您可以完全在函数controller 中编写代码。但这样一来,就很难区分哪个代码控制器正在执行,以及哪个代码将变量绑定到控制器。举个例子:

    function controller($scope) {
      var vm = this;
      vm.data = [];
      $scope.title = 'controller';
    
      activate();
    
      ///
      function activate() {
        getData()
          .then(data => {
            // do something with data
          });
    
        // ...
      }
    
      function getData() {
        ...
      }
    }
    

    通过阅读上面的代码,我们可以很容易地了解控制器中正在使用的变量,而无需具体深入控制器。通过遵循这个约定,我们将始终知道控制器将在调用 activate() 的位置开始执行业务逻辑。

    【讨论】:

    • 没错,准确的答案。
    • 感谢您的回答,如果您能详细说明 - 1.为什么控制器在没有 IIFE 的情况下成为全局命名空间的成员?角度是否神奇地将控制器实例“附加”到它定义的范围?当我使用 IIFE 时,角度将它附加在哪里? 2.关于激活函数-您能否添加一个小代码示例来说明激活函数内部和外部的内容? (在我看来,我所有的控制器代码都是我添加到范围/控制器中的变量/函数的“声明”..)
    • @BornToCode -- 请查看更新后的答案。我希望这能帮助您更好地理解它。
    • 所以如果我将它与 C# 进行比较,那么 activate() 就像一个构造函数,并且“类成员”是在激活之前定义的,对吧?如果我理解正确这一行angular.module('app').controller('controller', controller); 只是定义了一个控制器,它将在加载带有 ng-controller="controller" 的视图时启动,当它“粘贴”到全局时我错过了角度魔术部分命名空间以及当我使用 IIFE 时它“粘”在哪里?
    • @BornToCode -- 正如我所提到的,您可以完全不用activate 来编写整个逻辑。但是,是的,只是为了类似于类似构造函数的函数,这是到位的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多