2012-10-02 14 views
43

Sto provando a creare una semplice calcolatrice in Angolare in cui posso sovrascrivere il totale se lo desidero. Ho questa parte di lavoro, ma quando poi torno a inserire un numero nei campi uno o due il totale non viene aggiornato nel campo.Campo di immissione dell'aggiornamento JS angolare dopo la modifica

Ecco il mio jsfiddle http://jsfiddle.net/YUza7/2/

La forma

<div ng-app> 
    <h2>Calculate</h2> 

    <div ng-controller="TodoCtrl"> 
    <form> 
     <li>Number 1: <input type="text" ng-model="one"> 
     <li>Number 2: <input type="text" ng-model="two"> 
     <li>Total <input type="text" value="{{total()}}">  
     {{total()}} 
    </form> 
    </div> 
</div> 

Il javascript

function TodoCtrl($scope) { 
    $scope.total = function(){ 
     return $scope.one * $scope.two; 
    }; 
} 
+0

Come ha detto @ Martin, è necessario associare l'ingresso ad un valore scrivibile (quindi non una funzione) per essere in grado di farlo indietro da $ scope nel controller. – Guillaume86

risposta

39

È possibile aggiungere la direttiva ng-change ai campi di input. Dai un'occhiata ai documenti example.

+0

Trovato ng-change per essere più adatti in quanto non interferisce con gli elementi caricati iniziali – map7

+11

Mentre una risposta utile, si qualifica come una risposta di solo collegamento. Sarebbe bello avere un esempio qui sul sito, facendo riferimento alla domanda concreta dell'OP ... –

+0

Dovresti usare $ watcher in direttiva invece di ng-change con un "callback" nella vista. Guarda i tuoi dati nel tuo codice di direttiva e salva la funzione di de-register in una var per chiamarla quando l'evento scope $ distrugge il fuoco. – Disfigure

28

Sto indovinando che quando si immette un valore nel campo totali che l'espressione del valore ottiene in qualche modo sovrascritto.

Tuttavia, è possibile adottare un approccio alternativo: creare un campo per il valore totale e quando le modifiche one o two aggiornano tale campo.

<li>Total <input type="text" ng-model="total">{{total}}</li> 

e modificare la javascript:

function TodoCtrl($scope) { 
    $scope.$watch('one * two', function (value) { 
     $scope.total = value; 
    }); 
} 

Esempio violino here.

+3

I campi di input +1 devono sempre avere una proprietà associata ng-model/$ scope. Il parametro "valore" non deve essere utilizzato nelle app Angolari. Vedi anche http://stackoverflow.com/questions/10610282/angularjs-value-attribute-on-an-input-text-box-is-ignored-when-there-is-a-ng-m –

-4

Creare una direttiva e metterci sopra un orologio.

app.directive("myApp", function(){ 
link:function(scope){ 

    function:getTotal(){ 
    ..do your maths here 

    } 
    scope.$watch('one', getTotals()); 
    scope.$watch('two', getTotals()); 
    } 

})

+0

Correggi il tuo esempio di codice. –

3

Hai solo bisogno di correggere il formato del codice HTML

<form> 
    <li>Number 1: <input type="text" ng-model="one"/> </li> 
    <li>Number 2: <input type="text" ng-model="two"/> </li> 
     <li>Total <input type="text" value="{{total()}}"/> </li>  
    {{total()}} 

</form> 

http://jsfiddle.net/YUza7/105/

+0

Il problema con questo è se cambio il totale, poi vai e cambia Numero 1 o Numero 2 il totale non funziona più come avrei sovrascritto il 'valore'.L'uso di ng-change non ha questo problema – map7

5

ho scritto una direttiva può essere utilizzata per associare un ng-modello per qualsiasi espressione che vuoi Ogni volta che l'espressione cambia, il modello viene impostato sul nuovo valore.

module.directive('boundModel', function() { 
     return { 
     require: 'ngModel', 
     link: function(scope, elem, attrs, ngModel) { 
      var boundModel$watcher = scope.$watch(attrs.boundModel, function(newValue, oldValue) { 
      if(newValue != oldValue) { 
       ngModel.$setViewValue(newValue); 
       ngModel.$render(); 
      } 
      }); 

      // When $destroy is fired stop watching the change. 
      // If you don't, and you come back on your state 
      // you'll have two watcher watching the same properties 
      scope.$on('$destroy', function() { 
       boundModel$watcher(); 
      }); 
     } 
    }); 

Si può usare nei template in questo modo:

<li>Total<input type="text" ng-model="total" bound-model="one * two"></li>  
Problemi correlati