2015-07-11 4 views
6

Ich schrieb zwei Direktiven. Einer von ihnen ist für die Eingabe von Zahlen mit Einheiten (wie „1m“) verwendet:Problem mit zwei Direktiven auf dem gleichen Modell

angular.module('ng', []) 
.directive('unit', function() { 
    return { 
     require: 'ngModel', 
     link: function (s, e, attributes, ngModel) { 
      ngModel.$parsers.push(function (i) { 
       return i + attributes.unit; 
      }); 

      ngModel.$formatters.push(function (i) { 
       return (i + '').replace(attributes.unit, ''); 
      }); 
     } 
    } 
}); 

Die zweite ersetzt , mit ., weil viele Menschen in Europa eine Dezimalzahl verwenden Komma statt Dezimalpunkt und ich möchte, dass meine Werte, die normalisiert werden sollen.

angular.module('ng', []) 
.directive('numberWithPoint', function() { 
    return { 
     require: 'ngModel', 
     link: function (s, e, attributes, ngModel) { 
      ngModel.$parsers.push(function (i) { 
       return i.replace(',', '.'); 
      }); 
     } 
    } 
}); 

Die Verwendung wäre:

<input type="text" ng-model="howLongSomethingIs" unit="m" number-with-point /> m 

Das Problem: die Richtlinie unit funktioniert gut, wenn sie allein ist, wenn ich die number-with-point Richtlinie hinzufügen, nimmt die unit keine Wirkung (der angezeigte Wert für Beispiel 1m nicht 1.

ich habe versucht, mit dem priority Eigenschaft innerhalb der return Objekt vermasselt, aber nichts geschah.

Wie können diese beiden Direktiven zusammenarbeiten?

In diesem jsfiddle scheint es zu funktionieren, aber es verwendet Angular 1.2.1. Ich benutze Angular 1.3.14. Weiß jemand, wie man Jsfiddle andere Version benutzt?

+0

Könnten Sie einen Plunker/jsbin der beiden Direktiven verdrahten? Das würde sicherlich helfen, es zu debuggen. –

+0

Ok, gute Idee. Warte eine Sekunde –

+0

Siehe Bearbeiten. Ich habe einige Kommentare hinzugefügt –

Antwort

1

In diesem Fall scheint es zu funktionieren, aber es verwendet Angular 1.2.1. Ich benutze Angular 1.3.14. Weiß jemand, wie man Jsfiddle andere Version benutzt?

Ich habe gerade den mitgelieferten Code lokal auf Angular 1.3.15 - funktioniert gut.

Die Eingabe 123071823,1238 ergibt 123071823.1238m, wenn sie an die Ansicht gebunden ist. Es scheint also gut zu funktionieren (an meinem Ende und in deiner Geige).

1.3.14 jsFiddle


eine andere Version auf jsFiddle Laden:

  1. Winkel Aus dem `Frameworks & Registerkarte Erweiterungen
  2. von code.angularjs.org Schnappen Sie sich Ihre Version.
  3. Fügen Sie den Link als External resource in jsFiddle.
+0

Vielen Dank für das Testen ... Ich weiß irgendwie nicht, was ich in meinem Produktionscode anders mache. Es ist eigentlich fast so einfach wie die Geige ... Sieht so aus, als müsste ich tiefer suchen. –

+0

Myeah. Ich wünschte, ich hätte hier mehr helfen können, aber es scheint zu funktionieren. –

+0

Siehe meine Antwort ... Nun, eigentlich hast du mir geholfen - denn wenn du es nicht mit meiner Angular-Version getestet hast, würde ich immer noch nach dem Fehler im Direktiven-Code suchen und ich hätte nicht das Richtige gefunden Lösung. –

1

Der Fehler wurde gefunden. Eine unglaublich dumme Sache. Meine Richtlinien wurden in zwei separaten Dateien deklariert, und jeder von ihnen ab:

angular.module('nameOfMyApp.directives', []) 

Natürlich eine Richtlinie Laden überschreibt die nameOfMyApp.directives Modul jedes Mal.

Ich habe es

angular.module('nameOfMyApp.directives') 

geändert und jetzt funktioniert es ganz gut.

Verwandte Themen