AngularJS:ngInclude vs指令


93

我不太了解何时使用指令以及何时更适合使用nginclude。以以下示例为例:我有一个局部,password-and-confirm-input-fields.html即用于输入和确认密码的html。我在注册页面和更改密码页面下都使用了它。这两个页面各有一个控制器,部分html没有专用的控制器。

我应该使用指令还是ngInclude为此?


我每次都会有一个指令,但是我很好奇Angular的人会怎么说。
奥斯丁·穆林斯

1
如果它确实是一个独立的组件,则可能应该具有与其关联的自己的控制器。IMO,我会使用一个部分-但是,我很好奇,对于一些更多的输入
tymeJV

4
如果该部分需要任何js代码,请使用指令。如果只是HTML,请使用ngInclude。
Daniel Beck 2014年

Answers:


122

这完全取决于您希望从代码片段中得到什么。就个人而言,如果代码没有任何逻辑,或者甚至不需要控制器,那么我就选择ngInclude。我通常会放置较大的“静态” html片段,这些片段我不想在此处造成混乱。(即:假设一个大表,其数据无论如何都来自父Controller。<div ng-include="bigtable.html" />与所有那些凌乱地占据View的行相比,它更清洁)

如果存在逻辑,DOM操作,或者您需要在使用的不同实例中对它进行可自定义(也称为不同的渲染),那么directives是更好的选择(起初它们令人生畏,但它们非常强大,请花点时间) 。

ngInclude

有时你会看到ngInclude's许多被其外部影响$scope/ interface。例如大型/复杂的中继器。因此,这两个接口被绑在一起。如果主要内容$scope发生变化,则必须在包含的部分中更改/更改逻辑。

指令

另一方面,指令可以具有显式作用域/控制器/等。因此,如果您考虑必须多次重用某些内容的情况,则可以看到连接其自身的作用域如何使生活变得更轻松和更少令人困惑。

另外,无论何时要与DOM进行交互,都应该使用指令。这样可以更好地进行测试,并将这些动作与控制器/服务/等等分离开来,这是您想要的!

提示:如果您关心IE8,请确保不要使用限制:“ E”!有很多解决方法,但是很烦人。只是让生活更轻松,并坚持使用属性/等等。<div my-directive />

组件 [2016年3月1日更新]

在Angular 1.5中添加了,它实际上是的包装.directve()。大部分时间都应该使用组件。默认情况下,它删除了许多样板指令代码restrict: 'E', scope : {}, bindToController: true。我强烈建议对您的应用中的几乎所有内容都使用它们,以便能够更轻松地过渡到Angular2。

结论:

大多数情况下,您应该创建零部件和指令

  • 更可扩展
  • 您可以模板化并将文件放在外部(例如ngInclude)
  • 您可以选择使用父作用域,也可以在指令中使用它自己的隔离作用域。
  • 更好地在整个应用程序中重复使用


更新3/1/2016

既然Angular 2逐步发展起来,我们知道通用格式(当然,这里和那里仍然会有一些变化),只是想添加它的重要性components(有时需要限制它们的指令:'例如E')。

组件 Angular 2的组件非常相似@Component。这样,我们将逻辑和html封装在同一区域中。


确保在组件中封装尽可能多的内容,这将使向Angular 2的过渡变得更加容易!(如果您选择进行过渡)

这是一篇很好的文章,描述了使用此迁移过程的过程directives(如果您当然要使用组件,则非常相似):http : //angular-tips.com/blog/2015/09/migrating-directives-to-angular-2/


5
我同意这个答案。指令的学习曲线很陡峭,但是一旦您掌握了它,它就会真正得到回报。
Jazzy 2014年

@mcpDESIGNS,一种情况可能并不完全适合此答案(至少不是前两个段落)。如果我有一个带有自己的控制器的nav-partial,并且我只会使用一次(在index.html文件中),那么这可能应该是局部的,而不是指令,因为它只使用了一次(它是从某种意义上讲,这是一个单独的应用程序,即使它具有自己的逻辑,也不会作为ngview的一部分包含在内。要么?
EricC 2014年

这仍扑朔迷离..使用ngInclude,看这个的时候,你也可以指定一个控制器:stackoverflow.com/questions/13811948/...
Marwen特拉贝尔西

1
当然,但是它总是以某种方式完全连接到父控制器。指令可以在内部为模板加载时创建控制器的位置。它可以完全独立(如果需要)
Mark Pieszak-Trilon.io,2015年

1
您可以做的最好的事情就是将此概念抽象为工厂或某种东西,这样您就可以从link函数内部调用它!毫无疑问,它将毫无疑问地被编入指令中:(@ Arwin
Mark Pieszak-Trilon.io
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.