AngularJS:嵌套"父依赖"的$ compile问题指示

时间:2014-06-13 15:37:29

标签: angularjs angularjs-directive

我在开发Angular库时遇到了一个问题:angular-coq。

我试图提供这些功能:

<div ng-controller="myController">
    <form coq-model="team1">
        <!-- Inputs will be automatically added to form (wrapped in <p>) -->
    </form>
</div>

myController在范围team1中公开,是一个包含2个属性的自定义类:idname

CoqModel指令将为每个属性追加元素<input coq-model-attribute="...">

CoqModelAttribute指令需要CoqModel作为父级才能引用当前模型(此处为team1)并将编译如下:

<div ng-controller="myController">
    <form coq-model="team1">
        <input type="<attribute_name>" ng-model="team1.<attribute_name>" coq-model-attribute="<attribute_name>"/>
    </form>
</div>

Here is the implementation of CoqModel directivehere is the implementation of CoqModelAttribute directive(此处无法粘贴)

你会看到我&#34; double- $ compile&#34; CoqModel指令。 如果我不这样做,生成的输入ng-model将不会被绑定..

所以一切正常,期待&#34; double- $ compile&#34;导致ng-click的一些问题。

在这种情况下:

<div ng-controller="myController">
    <form coq-model="team1">
        <input coq-model-attribute="name"/>
        <br />
        <input type="button" value="click me" ng-click="team1.update()" />
    </form>
</div>

点击&#34;点击我&#34;将调用方法team1.update 2次..

我尝试了很多不同的重构,都未能解决这个问题...... 如果您是其中一位有角度的专家,请告诉我如何解决这个问题:)

非常感谢!

1 个答案:

答案 0 :(得分:0)

Here is a link关于Stack Overflow上的类似问题,重要的是:

  

当您使用ng-repeat将指令放在同一元素上并调用$ compile(element)(scope);时,将重新编译您的元素,包括ng-repeat,从而导致ng-repeat再次运行。 / p>

也许在第二个$ compile期间,重新编译你的button元素,包括ng-click,导致ng-click运行两次。

这种硬编码的解决方案可能有用。使用问题按钮的选择器填充(selectorForYourButton),并在第二个$ compile的正上方包含此snippit。

(selectorForYourButton).removeAttr("ng-click");

这可能只是完全删除了ng-click的功能!如果是这样,请在第二个$ compile之后添加ng-click属性。

或者尝试使用

替换priority:101指令中的coqModelAttribute
  priority:1500,
  terminal:true,

以避免在angular编译元素后再次编译。