2012-08-08 26 views
6

Con Knockout, puedo decir¿Cómo puedo hacer que AngularJS vuelva a ejecutar una función cada vez que cambian los datos que utiliza?

<html> 
    <head> 
     <script type="text/javascript" src="knockout-2.1.0.js"></script> 
    </head> 
    <body> 
     <input type="text" data-bind="value: a"></input> + 
     <input type="text" data-bind="value: b"></input> = 
     <span data-bind="text: result"></span> 
     <script type="text/javascript"> 
      function ExampleViewModel() { 
       this.a = ko.observable(5); 
       this.b = ko.observable(6); 
       this.result = ko.computed(function() { 
        return parseInt(this.a()) + parseInt(this.b()); 
       }, this); 
      } 

      ko.applyBindings(new ExampleViewModel()); 
     </script> 
    </body> 
</html> 

y result se recalcula cada vez que un cambio y b. ¿Cómo puedo hacer que AngularJS haga esto por mí? He tratado

<html ng-app> 
    <head> 
     <script type="text/javascript" src="angular-1.0.1.min.js"></script> 
     <script type="text/javascript"> 
      function ExampleCtrl($scope) { 
       $scope.a = 5; 
       $scope.b = 6; 
       $scope.result = function() { 
        return this.a + this.b 
       }; 
      } 

</script> 
    </head> 
    <body ng-controller="ExampleCtrl"> 
     <input type="text" value="{{ a }}"></input> + 
     <input type="text" value="{{ b }}"></input> = 
     {{ result() }} 
    </body> 
</html> 

Después de un poco más de lectura, encontré ng-change:

<html ng-app> 
    <head> 
     <script type="text/javascript" src="angular-1.0.1.min.js"></script> 
     <script type="text/javascript"> 
      function ExampleCtrl($scope) { 
       $scope.a = 5; 
       $scope.b = 6; 
       $scope.result = function() { 
        return parseInt($scope.a) + parseInt($scope.b) 
       }; 
      } 

</script> 
    </head> 
    <body ng-controller="ExampleCtrl"> 
     <input type="text" ng-model="a" ng-change="result()"></input> + 
     <input type="text" ng-model="b" ng-change="result()"></input> = 
     {{ result() }} 
    </body> 
</html> 

Pero eso me obliga a no perder de vista el hecho de que el cambio de a o b cambia result(), ¿hay alguna manera automática de detectar esto?

+0

¿Ha intentado $ watch? http://docs.angularjs.org/api/ng.$rootScope.Scope – Eduardo

Respuesta

7

será re-evaluado a su función result() cada vez que el modelo cambia cuando se enlaza a través de ng-model en sus entradas como esta:

<input type="text" ng-model="a"></input> 

en lugar de:

<input type="text" value="{{ a }}"></input> 
+0

Parece que solo se usan trabajos de ng-model (no necesito especificar ng-change), gracias. Lamentablemente, se actualiza al instante. ¿Hay alguna forma de actualizarlo solo una vez que el foco abandona la entrada? –

+0

Esta publicación puede ayudar a diferir los cambios del modelo cuando el foco abandona la entrada: http://stackoverflow.com/a/11870341/1207991 – Gloopy

Cuestiones relacionadas