【问题标题】:Angular: Building a directive and remove attribute from root elementAngular:构建指令并从根元素中删除属性
【发布时间】:2013-04-10 07:38:53
【问题描述】:

是否可以这样做:

<field:text id="foo" label="Foo Label" model="model.foo" placeholder="foo" />

将被编译为:

<div class="control-group">
   <label class="control-label" for="foo">Foo Label</label>
   <div class="controls">
      <input type="text" id="foo" placeholder="foo" ng-model="model.foo">
   </div>
</div>

我试着做一个例子,但 Plunker 不让我保存我的例子...上传到 Dropbox:https://dl.dropbox.com/u/2862814/plunk.zip

该示例中断了诸如 ng-change 之类的内容。这是由于编译了 ng-change 指令。我尝试了对 fieldText 指令的高优先级,但没有修复它。

【问题讨论】:

    标签: templates angularjs angularjs-directive


    【解决方案1】:

    您在示例中非常接近,但您必须将 ng-change 放在模板中的输入字段上。你的旧代码:

    <field:text ng-change="updateHidden()" ...
    

    改成

    <field:text change="updateHidden()" ...
    

    并且在指令中(参见http://docs.angularjs.org/guide/directive - & 或 &attr - 提供了一种在父作用域的上下文中执行表达式的方法。)

    {scope:{change:'&' ...
    

    最后是指令模板

    <input ng-change="change()" ...
    

    这是一个经过修改且可以工作的 plunkr:http://plnkr.co/edit/QmQjGQQBRtDmkCka0dul?p=preview

    <field:text id="too" label="Too" model="model.too" placeholder="too" change="updateHidden()"></field:text>
    
    <script type="text/ng-template" id="/tpl.html">
    <div class="control-group">
       <label class="control-label" for="{{id}}">{{label}}</label>
       <div class="controls">
          <input ng-change="change()" type="text" id="{{id}}" placeholder="{{placeholder}}" 
          ng-model="model">
       </div>
    </div>
    </script>
    
    directive('fieldText',function(){
      return {
        restrict:'E',
        templateUrl:'/tpl.html',
        scope:{change:'&',id:'@',model:'=',placeholder:'@',label:'@'}
      }
    })
    

    【讨论】:

    • 谢谢。我考虑过这一点,但希望可以将表达式“移动”到另一个元素。因为这种方法的缺点是,每个模板都有 ng-change。这使得以后很难对其进行调试,并使 HTML 非常不干净。
    猜你喜欢
    • 2017-11-01
    • 2015-06-06
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2013-10-17
    • 2016-10-26
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多