Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio';s AngularJS模板说明_Angularjs_Visual Studio 2015_Angularjs Controller_Angularjs Injector_Self Invoking Function - Fatal编程技术网

Visual Studio';s AngularJS模板说明

Visual Studio';s AngularJS模板说明,angularjs,visual-studio-2015,angularjs-controller,angularjs-injector,self-invoking-function,Angularjs,Visual Studio 2015,Angularjs Controller,Angularjs Injector,Self Invoking Function,当我使用VS2015模板创建新控制器时,我得到以下代码: (function () { 'use strict'; angular .module('app') .controller('controller', controller); controller.$inject = ['$scope']; function controller($scope) { $scope.title = 'control

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

(function () {
    'use strict';

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

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

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

        activate();

        function activate() { }
    }
})();
问题:

  • 为什么VS模板会将代码包装在自开票函数中

  • activate()
    函数的作用是什么?我应该在里面写什么代码?为什么我需要一个单独的函数而不是只在控制器里面写代码

  • 执行
    控制器。$inject=['$scope']
    认为将依赖项写入数组(作为控制器函数的参数)是一种更好的做法

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

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

    activate()
    函数的作用是什么

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

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

    执行
    控制器。$inject=['$scope']被认为是更好的做法

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

    编辑1

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

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

    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的全局命名空间的成员,我将不胜感激?angular是否神奇地将控制器实例“附加”到其定义的范围?当我使用生命的时候,它在哪里?2.关于激活功能-您能否添加一个小代码示例来说明激活功能内部和外部的内容?(在我看来,我所有的控制器代码都是我添加到scope/controller中的变量/函数的“声明”。@BornToCode——请查看更新的答案。我希望这能帮助你更好地理解它。所以如果我把它和C#比较一下,那么activate()就像一个构造函数,“类成员”是在activate之前定义的,对吗?如果我正确理解这一行
    angular.module('app').controller('controller',controller)
    只定义了一个控制器,当加载带有ng controller=“controller”的视图时,该控制器将被启动。我缺少了角度魔法部分,它何时“粘贴”到全局名称空间,以及在我使用IIFE时在何处“粘贴”?@BornToCode——正如我所提到的,您可以编写整个逻辑,而不必使用
    activate
    。但是,是的,只是为了类似于构造函数一样的函数,这是适当的。