我对角度指令有一个奇怪的问题。
这是对事实的详细描述,嵌入在我的 (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:true
drtv-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 代码之前运行。)
我的第二个问题: 为什么简单地用容器元素包装代码来解决问题?框架的行为不是那么弱且不那么健壮吗?