2015-04-01 212 views
0

我有一個元素指令和屬性的指令:如何從AngularJS中的元素指令中刪除屬性指令?

<my-element my-attribute="value"></my-element> 

我的屬性是需要ngModel一個指令:

app.directive('myAttribute', [ 
    function() { 

     var definition = { 
      restrict: 'A', 
      require: 'ngModel', 
      link: function ($scope, $element, $attrs, ctrl) {...} 
} 
return definition; 

我的元素可以在沒有NG-模型,但的模板中使用my-element包含總是具有ng-model的輸入。我的屬性應該從我的元素中刪除,並添加到我的元素內的輸入。在我的my-element指令中的編譯函數中,我有:

var value = element.attr('my-attribute'); 
element.remove('my-attribute'); 
element.find('input').attr('my-attribute', value); 

當屬性指令沒有require:'ngModel'時,它工作正常。但如果我需要ngModel,我會得到:

Error: [$compile:ctreq] Controller 'ngModel', required by directive 'myAttribute', can't be found!

爲什麼?我怎樣才能解決這個問題?

+0

錯誤是相當明顯的或可能是我沒有得到的問題 – harishr 2015-04-01 13:26:34

+0

我的屬性被我的元素從我的元素中刪除,並添加到我的元素中有輸入ngModel – latata 2015-04-01 13:28:59

+0

,但即使在角度取代你的指令html ,它將驗證是否滿足require屬性...並且在那個時候,你的指令的屬性中沒有ng-model ...因此錯誤 – harishr 2015-04-01 13:30:51

回答

2

當您有require: 'ngModel'時,如果在該指令所在的元素上沒有ng-model屬性,則會收到錯誤 - 這是此指令屬性的含義。它說:「給我ngModel控制器的控制器作爲鏈接功能的第四個參數。」

爲了避免這種情況,如果你不總是需要使用它,你可以在ngModel之前添加一個?符號它意味着它是可選:

.... 
require: '?ngModel', 
.... 
1

如果你想刪除某個屬性,你應該使用

element.removeAttr('my-attribute'); 

我不知道你在鏈接功能的意圖,但你可以使鏈接功能在myAttribute ru ñ只有在有該元素在NG-模型屬性:

require: 'ngModel', 
compile: function(el, attr) { 
    if (attr.ngModel) { 
     return function(scope, elm, attr, ngModel) { 
      // link function 
     } 
    } 
} 

這是可能的,因爲角度不設法找到所需要的指令,直到它要執行鏈接功能該指令。