AngularJS:这个指令在做什么?

时间:2014-06-19 14:14:04

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-service

我对AngularJS有一些经验,并且在网上遇到过这个指令,但它不像我以前见过的任何东西,我无法理解它在做什么?有人可以帮忙吗?

具体问题:由于缺乏了解,指令的签名必须是依赖注入。但我正在努力的是:如果在数组中传入$ injector,为什么它也作为参数发送到函数中,即函数($ injector);换句话说,为什么有两个$注射器?如果我不在数组中发送$ injector,那么什么是行不通的?

此指令又如何嵌入控制器?你什么时候定义这样的控制器?

此外,我通常会在下面的代码中看到带有$前缀的范围,如果没有$?

,它是如何工作的

任何阅读更多或在此解释的链接都会很有用。

.directive('mycomp', [
    '$injector', function($injector) {
      var $builder, $compile, $drag;
      $builder = $injector.get('$builder');
      $drag = $injector.get('$drag');
      $compile = $injector.get('$compile');
      return {
        restrict: 'A',
        scope: {
          component: '=mycomp'
        },
        controller: 'mycompController',
        link: function(scope, element) {
          scope.copyObjectToScope(scope.component);
          $drag.draggable($(element), {
            mode: 'mirror',
            defer: false,
            object: {
              componentName: scope.component.name
            }
          });
          return scope.$watch('component.template', function(template) {
            var view;
            if (!template) {
              return;
            }
            view = $compile(template)(scope);
            return $(element).html(view);
          });
        }
      };
    }
  ])

1 个答案:

答案 0 :(得分:4)

  

为什么它也作为函数发送,即函数($ injector);换句话说,为什么有两个$注射器?

在进行数组类型注入时,调用函数中的参数并不重要,它将映射到数组项。例如,如果我们有

['$injector', function(a) {..}]

参数a将映射到$injector个实例,如果我们有

['$injector', '$scope', function(a, b) {..}]

a将映射到$injector个实例,而b将映射到$scope个实例。这里的顺序很重要。更多信息如下:{关于缩小的注意事项部分中的https://docs.angularjs.org/tutorial/step_05

  

如果我不在数组中发送$ injector,那么什么是行不通的?

如果你不这样做,$ injector将是未定义的,其中一些就是上面解释的。

  

此指令又如何嵌入控制器?你什么时候定义这样的控制器?

如果需要,某些指令可以有控制器,它们应该包含一些较重的逻辑,$ scope绑定等等。 link 函数实际上应该只保存与$ element的交互。 更多信息:http://www.sitepoint.com/practical-guide-angularjs-directives/

  

此外,我通常会在下面的代码中看到带有$前缀的范围,如果没有$?

,它是如何工作的

在这种情况下,scope用于链接功能,它不是一个可注意的。在这种情况下,它是一个简单的变量scope,它指的是控制器范围。您可以将其称为superBigVariableName,它仍然会引用范围并仍然有效。 所以请记住,链接函数实际上是一个简单的函数,其中第一个属性是范围,第二个是元素,第三个是属性,您不能将服务注入链接函数(在控制器中执行该逻辑)