2013-11-28 6 views
6

Ich bin gestern von eckigen 1.0.8 zu eckigen 1.2.2 gewandert, und neben ein paar anderen Dingen, die kaputt gegangen sind und ich habe bereits behoben, die Die $ render Funktion der folgenden Direktive wird nicht mehr ausgelöst.

Hat jemand encouter ein solches Verhalten vor 0

directive('validFile', function (utils, $filter) { 
    return { 
     require: 'ngModel', 
    link: function (scope, el, attrs, ngModel) { 

     if(utils.isMobileAgent()) 
      return; 
     var form = el.parents().find('form'); 
     ngModel.$render = function() { 
      debugger; 
      if(form.hasClass('ng-pristine')) 
      return; 

      if(el.val() && el.val().length > 0){ 
      ngModel.$setViewValue(el.val()); 
      } 

      if(el.hasClass('ng-invalid')){ 
      el.parent().addClass('ng-invalid').addClass('ng-invalid-required'); 
      ngModel.$setValidity(attrs.name, false); 
      ngModel.$setPristine(attrs.name, false); 
      scope.fileMsg = $filter('translate')('PLEASESELECT') + ' ' + $filter('translate')(attrs.name); 
      // scope.layout.showFileError = true; 
      } 
      else{ 
      el.parent().removeClass('ng-invalid').removeClass('ng-invalid-required').addClass('ng-valid'); 
      ngModel.$setValidity(attrs.name, true); 
      } 
     }; 
     el.bind('mouseover', function(){ 
      if(form.hasClass('ng-dirty') && el.parent().hasClass('ng-invalid')) 
      el.removeClass('ng-pristine'); 
     }); 
     el.bind('mouseleave', function(){ 
      if(el.val() && el.val().length > 0){ 
      el.addClass('ng-pristine'); 
      } 
     }) 
     el.bind('change', function() { 
      scope.$apply(function() { 
       ngModel.$render(); 
      }); 
     }); 
     form.bind('change', function() { 
      scope.$apply(function() { 
       ngModel.$render(); 
      }); 
     }); 
    } 
}; 
}); 

Markup:

<input type="file" data-ng-model='model.formData.resume' name="resume" data-valid-file data-my-validate data-value-required="true"> 

Antwort

5

Erhöhen Sie die Priorität Ihrer Richtlinie auf etwas über 0

Zum Beispiel:

myApp.directive('validFile', function ($filter) { 
    return { 
    priority: 10, 

Hier ist eine , die ich mit this ui-tinymce issue verbunden, das ist, an der Wurzel, die gleiche wie Ihre.

Die kurze Version der Erklärung ist, dass this changeinput$render Vorrang vor Ihrem eigenen hat. Indem Sie die Priorität Ihrer Direktive stossen, geben Sie Ihrer $render Priorität, wie es vor dieser Änderung in 1.2 rc3 war.

+0

Ich nehme an, dass dies so richtig ist wie es wird, werde ich das morgen überprüfen und werde Sie auf dem Laufenden halten, könnten Sie antworten, wenn ich auf weitere Probleme stoße ?. Grundsätzlich habe ich die Angular 1.2.x Build-Funktion verwendet, um ng-Modell an ein Dateifeld zu binden, nachdem dieses Problem aufgetreten ist. –

+0

Ja, es dauerte ziemlich viel zu graben, um dies zu finden. Ich würde die Änderungsprotokolle im Auge behalten - ich wäre nicht überrascht, wenn Angular etwas tun würde, um das zu beheben. In der Zwischenzeit sehe ich keinen Grund, warum eine höhere Priorität Probleme verursachen sollte. – KayakDave

+0

Hört sich gut an, ich werde es morgen überprüfen und Sie wissen lassen, ob es das war :) Danke! –

1

Ich habe dies mit eckigen 1.2.10 für ein Textfeld getestet und welche Priorität ich auch gesetzt habe, ursprüngliche Eingabe $ render-Methode wurde nach dem Überschreiben meiner $ Render-Funktion gesetzt.

Dieses Problem tritt auch im angular-ui ynymce-Modul auf, das den anfänglichen Modellwert nicht wiedergeben kann. Also änderte ich den Timeout Teil in tinymce Richtlinie die ursprüngliche $ Methode machen außer Kraft zu setzen, wie folgt:

var render = function() { // my rendering code }  
setTimeout(function() { 
         tinymce.init(options); 
         if (ngModel.$render != render) { 
          var originalRender = ngModel.$render; 
          ngModel.$render = function() { 
           originalRender(); 
           render(); 
          }; 
        } 
       }); 

Auf diese Weise, nachdem alle „Verbindung“ Funktionen ausgeführt werden, können Sie die Render-Methode überschreiben.

Verwandte Themen