Angular 1.2.0-rc.3指令优先级变更问题

时间:2013-10-16 13:41:01

标签: javascript angularjs

所以我有这个代码示例使用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在控制器范围内是不好的。

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

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

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

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

更新示例

所以这里有另一个吸尘器,其中包括我希望传达的更好的例子(实际上几乎没有风格,但不应该被要求得到重点):

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

我有3个指令:

  • 膨胀
  • 通知
  • isolateScope

expandder指令仅添加了能够扩展和折叠内容的功能,仅此而已。此功能应该能够单独使用或与其他指令一起使用(这就是为什么它有控制器)。

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

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

我只是不知道现在如何在1.2.0 RC3中运行指令才能在不使用isolateScope指令的情况下完成此操作(尽管我很乐意被证明是错误的)。

3 个答案:

答案 0 :(得分:0)

我已经更新了您的代码,以便它能够执行我认为您想要的内容(至少它的工作方式与您的旧代码相同,但在rc3下您可以使用):http://plnkr.co/edit/nsq4BGAih3lfNmS2mLP7?p=preview

但是我做了很多改变和重大的架构改变,所以让我知道这是否会偏离你想要实现的精神。

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

具体来说,我将模板移动到与管理generic的控制器相同的指令(contentVisible)。这样,更改contentVisible控制器与使用它的模板位于同一范围

现在specific只需调用required: generic控制器即可切换可见性(实际上是作为设置函数)。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

我找到了什么:  1.在rc2中它在rc3不稳定中工作正常  2.在rc3中,只有当模板是内联时它才能工作,但是当它是templateUrl时(即使是缓存)也不能工作

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

希望这会有所帮助。