2014-06-13 159 views
1

我在開發我的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指令將爲每個屬性附加元素a <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(太大,貼在這裏)

你會看到我「雙 - $編譯」CoqModel指令。 如果我不這樣做,生成的輸入ng-model將不會被綁定..

因此,一切工作正常,期望「雙$編譯」導致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> 

點擊「點擊我」將調用方法team1.update 2倍..

我已經嘗試了很多不同的重構,都未能解決這個問題... 如果你們其中一位是角度專家,請告訴我如何解決這個問題:)

非常感謝!

+1

你在做什麼,你首先需要手動調用'$ compile'?它看起來像你的'link'函數中的大部分邏輯產生的標記不應該在這裏完成。你應該爲你的指令使用一個模板,並用它來創建你的標記。即使您真的需要生成標記,它應該在您的指令的「編譯」功能內完成,而不是「鏈接」。看看ngRepeat的這個解釋,例如:http://liamkaufman.com/blog/2013/05/13/understanding-angularjs-directives-part1-ng-repeat-and-compile/ –

+0

你好@ju 感謝你的快速回復。 我無法在編譯函數中生成標記,因爲我需要$ parse attributes value來知道要創建多少個節點。 而$ parse需要範圍來評估值......你看到問題了嗎? – wittydeveloper

回答

0

Here is a link對堆棧溢出,最重要的一點存在類似的問題:

當你把你的指令與NG-重複相同的元素,並調用$編譯(元)(範圍);,您元素被重新編譯,包括ng-repeat,導致ng-repeat再次運行一次。

也許在第二次$編譯期間,您的按鈕元素會重新編譯,包括ng-click,導致ng-click運行兩次。

這種硬編碼的解決方案可能工作。使用問題按鈕的選擇器填充(selectorForYourButton),並在第二個$ compile之上包含此snippit。

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

雖然這可能只是刪除了ng-click的功能!如果是這樣,請在第二個$ compile之後添加ng-click屬性。

也許嘗試

priority:1500, 
    terminal:true, 

免去您priority:101coqModelAttribute指令,以避免角編制元素後重新編譯。

+0

感謝您的回覆! 第一個解決方案對我來說似乎是一個破解,我正在爲我的Angular問題尋找一個真正的解決方案。 第二個,更符合邏輯還不能解釋爲什麼我需要對我生成的標記進行雙重編譯。 我認爲我在編譯/鏈接指令機制中缺少一些東西... 我讓你的第二個解決方案作爲一個修補程序,但我仍然在爲我的'coq-model'指令尋找強大的實現 – wittydeveloper