2013-07-17 37 views
2

的功能,我創建了一個指令,要動態地添加一個NG-改變指令,所有子輸入標籤:添加NG-變化子元素從連接指令

myApp.directive('autosave', function ($compile) { 
    return { 
     compile: function compile(tElement, tAttrs) { 

      return function postLink(scope, iElement, iAttrs) { 

       var shouldRun = scope.$eval(iAttrs.autosave); 

       if (shouldRun) { 
        iElement.find(':input[ng-model]').each(function() { 
         $(this).attr("ng-change", iAttrs.ngSubmit); 
        }); 
        $compile(iElement.contents())(scope); 
        console.log("Done"); 
       } 
      }; //end linking fn 
     } 
    }; 
}); 

,我有就是NG的問題-change指令未運行。我可以看到它被添加到DOM元素但是在值更改時不執行。

奇怪的是,如果我嘗試用ng-click,它確實有效。

不知道這是否是ng-change的錯誤,或者我是否犯了錯誤。

小提琴是一種有NG-點擊(點擊輸入)http://jsfiddle.net/dimirc/fq52V/

小提琴是一種有NG-變化(應該火上的變化)http://jsfiddle.net/dimirc/6E3Sk/

BTW,我可以做這個工作,如果我將所有以編譯函數,但我需要能夠評估指令的屬性,我沒有從編譯fn訪問指令。

謝謝

回答

1

你讓你的生活比現在更難。您do'nt需要做的所有的角編譯/ EVAL /等東西 - 在最後角是JavaScript的:看到​​你的修改(工作中)這裏的例子:

if (shouldRun) { 
    iElement.find(':input[ng-model]').on('change', function() { 
    this.form.submit(); 
    }); 
    console.log("Done"); 
} 

http://jsfiddle.net/lgersman/WuW8B/1/

幾個音符到您的方法:

  • ng-change直接映射到JavaScript更改事件。所以如果有人在INPUT元素上使用剪切/複製/粘貼,您的提交處理程序將永遠不會被調用。更好的解決方案是使用「輸入」事件(捕獲所有修改情況)。

  • 像更改/輸入等原生事件將冒泡到瀏覽器中的父dom元素。所以它將完全一樣地將更改監聽器附加到表單而不是每個輸入。

  • 如果你想自動保存每一次編輯,你將有一個令人難以置信的大量的調用你的提交處理程序。更好的方法是減慢/限制提交事件委派(參見http://orangevolt.blogspot.de/2013/08/debounced-throttled-model-updates-for.html)。

  • ,如果你想自動保存每個編輯您完全跳過你的更改處理的東西,suimply監視更改的範圍和一切(這將在造成編輯角模型更新發生)將被罰款:

    範圍。手錶(功能(){ eElement [0] .submit(); });