3

所以我有这个使用 Angular 1.2 RC2 的代码示例,一切正常,您单击句柄以切换内容的显示,并且控制器和指令按预期具有单独的范围:

http://plnkr.co/edit/e3XAZuhSMAxmkWzKKM39?p=preview

现在我昨天升级到 Angular RC3,现在功能无法正常工作,因为它在 plunker 中,我得到了特定需要通用的错误,这是找不到的。通过更改日志,我认为这可能与这个重大更改有关:

$compile: due to 31f190d4, the order of postLink fn is now mirror opposite of the order in which corresponding preLinking and compile functions execute

为了解决这个问题,他们建议将帖子链接转换为预链接(我可以这样做,因为我的帖子链接需要访问预链接中不可用的范围)或降低指令的优先级。所以这个 plunker 可以做到这一点并且功能确实有效:

http://plnkr.co/edit/arP3aruH8HEdiwFg6mWp?p=preview

但是有一个主要问题,现在因为特定具有更高的优先级,不再创建通用需要的隔离范围,所以现在 contentVisible 位于控制器范围内,这并不好。

现在我可以将 scope: {} 从通用指令移动到特定指令,但是应该可以单独使用通用指令,如果我这样做,它将附加到它所属的任何范围,而不是它自己的(将无法拥有该指令的多个实例,这是它需要自己的范围的方式)。

我唯一能想到的就是添加一个指令,称为 isoScope,确保它具有非常高的优先级,并让它定义范围:{}。然后,如果我需要单独使用泛型,我只需要确保还添加 isoScope 指令以确保它具有隔离范围。像这样:

http://plnkr.co/edit/1NYHpUcPFWEbAzvkCeRH?p=preview

现在我希望有一种更好的方法可以在没有isolateScope 指令的情况下完成我正在寻找的东西。如果没有那个,我会错过这种方式吗?

更新示例

所以这里是另一个 plunker,其中包括我想要传达的更好的例子(仍然几乎没有风格,但不应该需要传达这一点):

http://plnkr.co/edit/KtRMa1c9giDrhi1Rqyho?p=preview

我有 3 个指令:

  • 膨胀机
  • 通知
  • 隔离范围

扩展器指令仅添加能够扩展和折叠内容的功能,仅此而已。此功能应该能够单独使用或与另一个指令一起使用(这就是它具有控制器的原因)。

notification 指令用于显示通知,但是由于我们不想一直显示通知,我们将它与 expander 指令一起使用,以便用户可以切换实际通知的显示(类似于 stackoverflow.com 的方式)它在左上角)。

虽然我认为扩展器很可能与另一个指令一起使用,但它应该可以单独使用,这就是isolateScope 指令发挥作用的地方。由于扩展器指令将数据添加到范围,并且您可能希望在同一页面上有多个扩展器,因此它需要具有隔离范围才能工作。现在在用户个人资料页面上,您拥有开发人员密钥和地址等数据,您实际上并不需要一直显示这些数据,因此让用户控制它。我有隔离范围能够独立控制这两个范围,因为没有隔离范围,它们都将位于同一范围内并由 contentVisible 上的同一实例控制。

我只是看不到指令现在如何在 1.2.0 RC3 中运行,以便能够在没有该isolateScope 指令的情况下完成此任务(尽管我很高兴被证明是错误的)。

4

3 回答 3

0

我已经更新了您的代码,以便它执行我认为您想要的操作(至少这与您的旧代码一样,但在您想要的 rc3 下): http ://plnkr.co/edit/nsq4BGAih3lfNmS2mLP7?p=preview

但是我做了很多改变和重大的架构改变,所以如果这偏离了你想要实现的精神,请告诉我。

我认为问题的要点是您的两个指令 (genericspecific) 紧密耦合,contentVisible从而产生了复杂的依赖关系,导致您必须非常小心地管理调用时间。我的方法是解耦这两个指令——封装contentVisiblegeneric. 这允许genericspecific完全独立地实例化。所以你不依赖于任何调用时间。因此指令优先级更改不再对此代码产生任何影响。因此,我提出的解决方案的一大胜利是它应该能够抵御 Angular 团队的进一步更改。

具体来说,我将模板移入与generic管理contentVisible. 这样,更改的控制器contentVisible与使用它的模板位于同一范围内

现在specific只需调用required: generic控制器来切换可见性(有效地作为 setter 函数)。

我还将ng-class分配移动到模板中,以便将更改封装在一个地方(模板)中,因此您不需要 jquery 或link:/ compile:on generic

于 2013-10-16T15:46:00.977 回答
0

这是一种回归。修复工作正在进行中:https ://github.com/angular/angular.js/issues/4431

于 2013-10-17T12:20:22.717 回答
0

我有问题,看起来很接近你的。因此,如果有任何变化希望得到通知。我的任务:我有联系人,可以以不同的方式显示(非常常见的任务),但视图之间的区别在于模板,而帮助功能和准备工作是相同的,所以我需要所有视图的通用指令。

我发现: 1. 在 rc2 中它在 rc3 不稳定 2. 在 rc3 中它只能在模板内联时工作,但在它是 templateUrl 时不能工作(即使缓存)

所以我创建了两个木板rc2 版本rc3 版本

希望这会有所帮助。

于 2013-11-05T13:09:13.883 回答