2

我对角度指令有一个奇怪的问题。

这是对事实的详细描述,嵌入在我的 (2) 问题中。

我有两个指令 drtv-a 和 drtv-b。drtv-a 在它的模板中使用 drtv-b

drtv-a 模板:

<drtv-b some-attribute="something"></drtv-b>

这是我在另一段 html 元素中使用 drtv-a 的方法:

<drtv-a some-other-attribute="other something"></drtv-a>

drtv-a 定义为replace:true. 我挂在它的控制器中$scope.something ={...}

drtv-b 用 定义scope:true,一旦使用,他正在验证和验证所有者范围确实有“东西”。

问题:

drtv-b 的验证代码在 drtv-a 控制器执行之前执行。这会导致我的应用程序对 drtv-b 的验证失败(因为找不到属性“某物”)。

经过长时间的调查,问题似乎出在 drtv-a 定义上,在replace:true定义上!

使用replace:truedrtv-a 使模板的 html 看起来像这样:

<drtv-b some-attribute="something" some-other-attribute="other something"></drtv-b>

虽然这是我期望replace:true做的(根据它的文档),它也(出乎意料地)改变了角度构造的执行顺序:内部指令代码(drtv-b)现在在外部指令(drtv- a) 控制器有机会正确启动。这是不正常的(想要的 + 预期的 + 记录的)行为。

我的第一个问题: 为什么会这样?是错误还是我无法理解的东西?

然后,我发现了更奇怪的问题:

如果我将 drtv-a 的模板更改为包含在<div>元素中:

<div>
    <drtv-b some-attribute="something"></drtv-b>
</div>

并将replace:true定义返回给drtv-a,然后在angular执行替换后,html代码现在看起来像这样:

<div some-other-attribute="other something">
    <drtv-b some-attribute="something"></drtv-b>
</div>

它运行正常!

(即:drtv-a 控制器代码在使用它的 drtv-b 代码之前运行。)

我的第二个问题: 为什么简单地用容器元素包装代码来解决问题?框架的行为不是那么弱且不那么健壮吗?

4

1 回答 1

0

抱歉,除了嵌套或replace: false.

主要是由于与您类似的问题,replace现已弃用:请参阅文档。有关以下方面的更多背景信息和问题replace: trueGitHub 提交GitHub 问题以及为什么在 AngularJS 中不推荐使用替换?

从 GitHub 问题:

[...] 你不会看到 replace 从 angular 1.x 中消失(我不确定,但我很确定我们不会删除它,因为这是一个巨大的突破性变化。它已被弃用,仅此而已)。

它已被弃用,因为 replace: true 存在已知的非常愚蠢的问题,其中许多问题无法以合理的方式真正修复。如果您小心并避免这些问题,那么您将获得更多权力,但为了新用户的利益,更容易告诉他们“这会让您头疼,不要这样做”。

于 2016-03-02T08:40:11.717 回答