【问题标题】:AngularJS: How to transclude multiple directives?AngularJS:如何嵌入多个指令?
【发布时间】:2013-08-28 19:44:33
【问题描述】:

(1) 我有一个名为portlet 的嵌入指令,它获取其内容并将其包装在一些样板代码中。例如:

<portlet>
  <div class="foobar">My content</div>
</portlet>

遍历portlet的模板,即:

<div class="portlet">
  <div class="icon"></div>
  <div class="content" ng-transclude="">          
  </div>
</div>

然后变成:

<div class="portlet">
  <div class="icon"></div>
  <div class="content">
      <div class="foobar">My content</div> <!--the original content
                                         passed to portlet-->
  </div>

(2) 我还有两个指令,dyn-formdyn-form-field。是这样描述的:

<dyn-form>
   <dyn-form-field type="textbox" placeholder="..." label="Name" />
   <! ...and so on... -->
</dyn>

dyn-form的模板:

<form class="..." ng-transclude="">
</form>

每个dyn-field 的模板都会生成用于为其生成标签/字段的html。所以原来的代码被翻译成这样的:

<form class="...">
  <label>Name: <input type="text" placeholder="..." /></label>
  <!- ....and so on... -->
 </form>

(3) 这就是问题所在。我想使用第三个指令dyn-form-portlet 来生成样板代码以显示每个表单上方显示的一些按钮,然后显示一个portlet,并将dyn-form 放在portlet 中。这就是我尝试这样做的方式:

<dyn-form-portlet>
   <dyn-form>
     <dyn-form-field />
   </dyn-form>
</dyn-form-portlet>

dyn-form-portlet 的模板如下所示:

<div class="dyn-form-portlet">
  <button>Foo</button>
  <button>Bar</button>
  <portlet ng-transclude="">
  </portlet>
</div>      

理论上这应该可行,即&lt;dyn-form&gt; 应该放在&lt;portlet&gt; 中,&lt;dyn-form-field&gt;s 应该放在&lt;dyn-form&gt; 中,等等。但是当我运行它时,我只看到dyn-form-portlet 显示的按钮和portlet 的代码,但portlet 是空的,并且没有显示表单。

是我做错了什么,还是这是一个错误?

【问题讨论】:

  • 如果有人感兴趣,请打个招呼:plnkr.co/edit/FUYCQbw8Tnx3Qhcj4108?p=preview 如果您从 portlet 中删除 transclude: true ,它可以工作,但我不确定其中的含义。
  • 这就是我认为正在发生的事情。 dyn-form-portlet 模板中的 &lt;portlet&gt; 指令在链接指令之前由 Angular 编译,因此当 dyn-form-portlet 被处理时,其模板中的 portlet 标记已经被渲染。看看这个Plunker 并查看控制台输出。不知道这是一个错误还是只是在这种情况下 Angular 的自然行为。
  • @MichaelBenford 这确实是正在发生的事情,但它似乎是一个错误。我的意思是,dyn-form 中的所有子指令都被嵌入到dyn-form 中,那为什么dyn-form-portletdyn-form 应该不同呢?任何人都可以将此作为错误报告给 AngularJS 团队吗?
  • @JesusRodriguez 谢谢

标签: javascript angularjs


【解决方案1】:

我已经设法解决了这个问题。我在portlet 指令上使用了transclude : 'element'replace : true,并且我给它的priority 比其他指令更高。我这样做的原因是感觉而不是对角内部运作的深入了解。

关于第一部分 使用transclude : 'element' 是因为

'element' - 嵌入整个元素,包括以较低优先级定义的任何指令。

使用替换是因为据我所见,当 transclude 设置为元素时总是使用它。 我的直觉是优先考虑。

这里是 plnkr http://plnkr.co/edit/axQ90dHOLmLNeNQ4ZlNl?p=preview

这可能不是您正在寻找的答案,但我需要深入研究角度指令才能真正了解发生了什么。无论如何,这不是一个错误,它只是糟糕的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 2014-05-08
    • 2014-04-03
    相关资源
    最近更新 更多