Compatibilidad con Getter & Setter con ng-model en AngularJs
Estoy tratando de obtener el soporte de get / setter para ng-model mediante la implementación de una directiva que se encargue de obtener y establecer los valores a / desde la vista / modelo. Ya casi llego, pero termino en infinitos bucles de digestión.
La idea es establecer ng-model = "$ someFieldToStoreInTheScope", y luego hacer que la directiva getter / setter haga las actualizaciones entre ese campo y las funciones de getter / setter.
Utilizo $ watch para actualizar el modelo con la expresión de establecimiento cuando ngModelController actualiza el campo en el alcance, y otro aviso para actualizar ese campo cuando cambia la expresión de obtención.
Mira esto:http://jsfiddle.net/BDyAs/10/
HTML:
<div ng-app="myApp">
<body>
<form name="form">
<input type="text" ng-model="$ngModelValue" ng-model-getter-setter="get=getValue();set=setValue($value)"/> {{myDerivedValue}}
</form>
</body>
</div>
JS:
var myApp = angular.module('myApp', []);
myApp.directive(
{
'ngModelGetterSetter': function () {
return {
require: "ngModel",
controller: ctrl,
link: function(scope, element, attrs, ngModelCtrl)
{
var getterSetterExpression = attrs.ngModelGetterSetter;
var tokens = getterSetterExpression.split(";");
var getExpression = tokens[0].split("=")[1];
var setExpression = tokens[1].split("=")[1];
function updateViewValue()
{
var updateExpression = attrs.ngModel + "=" + getExpression;
scope.$eval(updateExpression);
}
function updateModelValue()
{
scope.$value = ngModelCtrl.$viewValue;
scope.$eval(setExpression);
}
updateViewValue();
scope.$watch(getExpression, updateViewValue);
scope.$watch(attrs.ngModel, updateModelValue);
}
};
}
});
function ctrl($scope) {
$scope.getValue = function ()
{
return $scope.myValue;
}
$scope.setValue = function (val)
{
$scope.myValue = val;
$scope.myDerivedValue = $scope.myValue * 2;
}
$scope.setValue(5);
setInterval(function () { $scope.setValue($scope.getValue() + 1); $scope.$apply(); }, 1000);
}
He puesto un setInterval () en mi código para modificar el modelo y ver si se propaga correctamente en la vista.
¿Alguna idea de por qué hay un bucle de digestión infinito y cómo eliminarlo?