2015-12-26 44 views
0

我創建了一個使用模板的指令,使用此指令後,input type = radio不再更新模型。普通文本類型可以正常工作。輸入無線電沒有更新模型

我該怎麼做才能保持模型更新?

app.directive('advformInput', function($compile) { 
     return { 
      restrict: 'A', 
      priority: 1002, 
      transclude: true, 
      replace: true, 
      template: [ 
       '<div class="advform-input form-group">', 
       ' <label class="advform-lbl">', 
       '  <input class="form-control" />', 
       '  <div class="helper" ng-show="advformInput">{{ advformInput }}</div>', 
       ' </label>', 
       '</div>' 
      ].join('\n'), 
      scope: { 
       advformInput: '@' 
      }, 
      link: function ($scope, tElement, tAttrs, $ctrls) { 
       var ar = ['type', 'name', 'ng-model', 'value']; 
       var block = tElement, inp = tElement.find('input'); 

       $scope.field = tAttrs.advformInput; 

       tElement.removeAttr('advform-input') 

       // transfer some attributes to the real input 
       _.each(ar, function(val, key){ 
        inp.attr(val, block.attr(val)) 
        block.removeAttr(val) 
       }) 

       // add the type of the input to the div like a class 
       block.addClass('inp-' + inp.attr('type')); 

       //$compile(inp)($scope); 
      } 
     }; 
    }); 

回答

1

沒有與結合,我想你想true & false值傳遞給指令與@是該問題的任何問題。

讓我們深入探討問題。

您的指令隔離範圍綁定使用的是advformInput: '@'},這意味着您想使用one way binding。但是,當您從指令元素傳遞值時,advformInput值會轉換爲字符串,而不是將該值的dataType保留爲Boolean

同樣在這裏,你是從屬性傳遞價值advform-input="{{myBoolValue}}"如果true(布爾),然後爲"true"(串)接受,當它是false然後"false"

因此,在您的指令模板中,評估ng-show指令值在兩種情況下均已作爲string傳遞。這就是爲什麼ng-show="someString"總是會成爲現實。

代碼

scope: { 
    advformInput: '=' //`=` for pass value with two way binding also conserves dataType. 
}, 

所以我的建議是轉換@結合=爲保護參數的類型,而通過它來指導。

如果您真的關心指令的單向綁定,那麼您需要更改ng-show指令表達式,如下所示。

ng-show="advformInput == 'true'"