Javascript 与#x27;控制器'';链接';和';编译';定义指令时的函数

Javascript 与#x27;控制器'';链接';和';编译';定义指令时的函数,javascript,angularjs,web-applications,javascript-framework,Javascript,Angularjs,Web Applications,Javascript Framework,有些地方似乎将控制器功能用于指令逻辑,而另一些地方则使用链接。angular主页上的选项卡示例将控制器用于一个指令,将链接用于另一个指令。这两者的区别是什么 我将稍微扩展一下您的问题,并包括编译函数 编译函数-用于模板DOM操纵(即操纵tElement=template元素),因此操纵适用于与指令关联的模板的所有DOM克隆。(如果还需要链接函数(或前后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为如果定义了'compile'属性,则'link'属性将被忽略。) link函数-

有些地方似乎将控制器功能用于指令逻辑,而另一些地方则使用链接。angular主页上的选项卡示例将控制器用于一个指令,将链接用于另一个指令。这两者的区别是什么

我将稍微扩展一下您的问题,并包括编译函数

  • 编译函数-用于模板DOM操纵(即操纵tElement=template元素),因此操纵适用于与指令关联的模板的所有DOM克隆。(如果还需要链接函数(或前后链接函数),并且定义了编译函数,则编译函数必须返回链接函数,因为如果定义了
    'compile'
    属性,则
    'link'
    属性将被忽略。)

  • link函数-通常用于注册侦听器回调(即作用域上的
    $watch
    表达式)以及更新DOM(即操纵iElement=单个实例元素)。它在克隆模板后执行。例如,在一个
  • 内部,链接功能在该特定
  • 元素的
  • 模板(tElement)被克隆(到IEElement)后执行。
    $watch
    允许向指令通知作用域属性更改(作用域与每个实例关联),这允许指令向DOM呈现更新的实例值

  • 控制器功能-当另一个指令需要与此指令交互时必须使用。例如,在AngularJS主页上,pane指令需要将自身添加到tabs指令维护的范围中,因此tabs指令需要定义pane指令可以访问/调用的控制器方法(想想API)

    有关选项卡和窗格指令的更深入解释,以及为什么选项卡指令使用
    this
    (而不是
    $scope
    )在其控制器上创建函数,请参阅


通常,您可以将方法、
$watchs
等放入指令的控制器或链接函数中。控制器将首先运行,这有时很重要(请参阅此日志,其中记录了ctrl和link函数使用两个嵌套指令运行时的情况)。正如Josh在一篇文章中提到的,为了与框架的其余部分保持一致,您可能希望将作用域操纵函数放在控制器中。

作为Mark答案的补充,编译函数没有访问作用域的权限,但链接函数有权访问

我真的推荐这个视频;作者Misko Hevery(AngularJS之父),他在书中描述了差异和一些技巧。(编译函数和处的链接函数之间的差异)


  • 编译前运行代码:使用控制器
  • 编译后运行代码:使用链接
  • 角度约定:在控制器中编写业务逻辑,在链接中编写DOM操作

    除此之外,您还可以从另一个指令的链接函数调用一个控制器函数

    <animal>
    <panther>
    <leopard></leopard>
    </panther> 
    </animal>
    

    将有助于了解指令间通信

    编译函数-

  • 在控制器和链接函数之前调用
  • 在compile函数中,您拥有原始模板DOM,因此您可以在AngularJS创建其实例和创建作用域之前对原始DOM进行更改
  • ng repeat是一个完美的例子-原始语法是模板元素,HTML中的重复元素是实例
  • 可以有多个元素实例,但只能有一个模板元素
  • 范围还不可用
  • 编译函数可以返回函数和对象
  • 返回(后链接)函数-相当于在编译函数为空时通过config对象的link属性注册链接函数
  • 返回通过pre和post属性注册函数的对象-允许您控制在链接阶段何时调用链接函数。请参阅下面有关预链接和后链接功能的信息
  • 语法

    function compile(tElement, tAttrs, transclude) { ... }
    
    控制器

  • 在编译函数之后调用
  • 范围在这里可用
  • 可由其他指令访问(请参见require属性)
  • 预链接

  • link函数负责注册DOM侦听器以及更新DOM。它在克隆模板后执行。这就是大多数指令逻辑的位置

  • 可以使用angular.element更新控制器中的dom,但不建议这样做,因为链接函数中提供了元素

  • Pre-link函数用于实现当angular js已经编译了子元素但在调用子元素的任何post-link之前运行的逻辑

  • 发布链接

  • 指令只具有链接功能,angular将该功能视为post链接

  • post将在compile、controller和pre-link函数之后执行,因此这被认为是添加指令逻辑的最安全和默认位置


  • 这个解释应该在AngularJS的主要文档中,或者至少是对它的引用。这是一个信息丰富的答案,但我认为它很难阅读。也许更多的标点符号和更小的句子会有所帮助。总的来说,我很感谢您的回答。$编译器在存在“compile”属性时忽略了“link”属性。但是如果存在“controller”属性呢?“controller”是否会导致$compiler忽略“link”和“compile”属性中的一个或两个?是否可能和/或