为什么$ compileProvider有一个指令方法?

时间:2017-02-03 20:33:02

标签: angularjs angularjs-directive

我从Angular文档中观察到,$compileProvider同时具有directive()component()方法。看到: https://docs.angularjs.org/api/ng/provider/$compileProvider

我还在文档中观察了该指令的用法 https://docs.angularjs.org/api/ng/service/$compile

搜索:'compileExample'

但我没有看到任何对目的的解释。

问题

问)为什么$ compileProvider有一个指令方法?目的或益处是什么?

问)如何在编译器中注册指令与在模块上声明指令不同?

2 个答案:

答案 0 :(得分:1)

  

如何使用编译器注册指令与在模块上声明指令不同?

module loader使用$compileProvider.directive()方法加载指令:

  

AngularJS Module Loader Source Code

/**
   * @ngdoc method
   * @name angular.Module#directive
   * @module ng
   * @param {string|Object} name Directive name, or an object map of directives where the
   *    keys are the names and the values are the factories.
   * @param {Function} directiveFactory Factory function for creating new instance of
   * directives.
   * @description
   * See {@link ng.$compileProvider#directive $compileProvider.directive()}.
   */
  directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),

不同之处在于模块加载器能够装饰指令并在配置阶段之前完成。我没有找到在配置阶段添加指令的用例。

答案 1 :(得分:0)

https://docs.angularjs.org/guide/module上的AngularJS指南声明:

<h2>Hoverable Dropdown</h2>
<p>Move the mouse over the text below to open the dropdown content.</p>

<div class="dropdown">
  <span>Mouse over me</span>
  <div class="dropdown-content">
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
    <p>Hello World!</p>
  </div>
</div>

所以我们知道至少display指示工厂angular.module('myModule', []). value('a', 123). factory('a', function() { return 123; }). directive('directiveName', ...). filter('filterName', ...); // is same as angular.module('myModule', []). config(function($provide, $compileProvider, $filterProvider) { $provide.value('a', 123); $provide.factory('a', function() { return 123; }); $compileProvider.directive('directiveName', ...); $filterProvider.register('filterName', ...); }); 是什么。

$compileProvider至少有一个重要的用例:在单元测试中模拟指令。要查看此内容,请查看Sylvain对此StackOverflow问题的答案:How do you mock directives to enable unit testing of higher level directive?