java的作用域如何确定_在AngularJS中编写指令时,如何确定是否不需要新的作用域,新的子作用域或新的隔离作用域?...

真是个好问题!我很想听别人说的话,但这里是我使用的指导方针 .

高空前提:范围用作我们用于在父控制器,指令和指令模板之间进行通信的“ Binders ” .

Parent Scope: scope: false ,所以没有新的范围

我没有't use this very often, but as @MarkRajcok said, if the directive doesn' t访问任何范围变量(显然没有设置任何!)然后就我而言这是好的 . 这对于仅在父指令的上下文中使用的子指令也很有用(尽管总是有例外),并且这些指令属于共享范围,因为您本身就暴露了访问和操作的范围(但是我确定这个规则有例外) .

作为一个例子,我最近创建了一个指令,使用我正在编写的SVG库绘制(静态)矢量图形 . 它 $observe 的两个属性( width 和 height )并在其计算中使用它们,但它既不设置也不读取任何范围变量且没有模板 . 这是一个不创建另一个范围的好用例;我们不需要一个,为什么要这么麻烦?

但是,在另一个SVG指令中,我需要使用一组数据,并且还需要存储一小部分状态 . 在这种情况下,使用父范围将是不负责任的(再次,一般而言) . 所以与其...

Child Scope: scope: true

具有子范围的指令具有上下文感知功能,旨在与当前范围进行交互 .

显然,这相对于隔离范围的一个关键优势是用户可以自由地对他们想要的任何属性使用插值;例如在具有隔离范围的指令上使用 class="item-type-{{item.type}}" 在默认情况下不起作用,但在具有子范围的指令上工作正常,因为在父范围内仍可以找到内插的内容 . 此外,该指令本身可以安全地评估其自身范围内的属性和表达式,而不必担心父母的污染或损害 .

例如,工具提示是刚刚添加的东西;隔离范围不起作用(默认情况下见下文),因为我们希望在这里使用其他指令或插值属性 . 工具提示只是一个增强功能 . 但是工具提示还需要在范围上设置一些用于子指令和/或模板的东西,显然要管理自己的状态,因此使用父范围确实非常糟糕 . 我们要么是在污染它,要么是在破坏它,也不是bueno .

我发现自己比孤立或父范围更频繁地使用子范围 .

Isolate scope: scope: {}

这适用于可重用的组件 . :-)

但严肃地说,我认为“可重用组件”是“独立组件” . 目的是将它们用于特定目的,因此将它们与其他指令组合或将其他内插属性添加到DOM节点本身就没有意义 .

更具体地说,此独立功能所需的任何内容都是通过在父作用域的上下文中评估的指定属性提供的;它们是单向字符串('@'),单向表达式('&')或双向变量绑定('=') .

在自包含组件上,由于它本身存在,因此需要在其上应用其他指令或属性是没有意义的 . 它的样式由自己的模板(如果需要)控制,并且可以将适当的内容转换(如果需要) . 它是独立的,所以我们把它放在一个隔离的范围内也说:“不要乱用它 . 我通过这几个属性给你一个定义的API . ”

一个好的最佳实践是排除为尽可能多的来自指令链接和控制器功能的基于模板的东西 . 这提供了另一个"API-like"配置点:指令的用户可以简单地替换模板!功能都保持不变,其内部API从未被触及,但我们可以根据需要混淆样式和DOM实现 . ui / bootstrap是如何很好地做到这一点的一个很好的例子,因为Peter&Pawel很棒 .

隔离范围也非常适合与转换一起使用 . grab 标签;它们不仅仅是整个功能,而且它内部的任何内容都可以在父范围内自由评估,同时让标签(和窗格)可以做任何他们想做的事情 . 选项卡显然有自己的状态,属于范围(与模板交互),但该状态与使用它的上下文无关 - 使用任何其他指令很有意义's entirely internal to what makes a tab directive a tab directive. Further, it doesn'标签 . 他们是标签 - 我们已经有了这个功能!

用更多功能包围它或者转换更多功能,但该指令已经是它的原样 .

所有这一切,我应该注意到,有一些方法可以解决隔离范围的一些限制(即特征),正如@ProLoser在他的回答中暗示的那样 . 例如,在子范围部分中,我提到了在使用隔离范围时默认情况下非指令属性的插值(默认情况下) . 但是,例如,用户可以简单地使用 class="item-type-{{$parent.item.type}}" ,它将再次起作用 . 因此,如果有令人信服的理由在子范围内使用隔离范围,但您担心其中一些限制,请知道如果需要,您可以解决几乎所有问题 .

Summary

没有新范围的指令是只读的;他们're completely trusted (i.e. internal to the app) and they don' t触摸插孔 . 具有子范围的指令添加功能,但它们不是唯一的功能 . 最后,隔离范围适用于作为整个目标的指令;它们是独立的,所以让它们变得流氓是可以的(而且大多数是"correct") .

我想初步想出来,但是当我想到更多的事情时,我会更新这个 . 但神圣的废话 - 这是一个很长的回答......

PS:完全相切,但由于我们谈论的是范围,我更喜欢说“原型”,而其他人更喜欢“原型”,这似乎更准确,但只是从舌头上滚下来并不是很好 . :-)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值