Я пытаюсь получить поддержку getter/setter для ng-модели, выполнив директиву, которая позаботится о получении и установке значений в/из представления/модели. Я почти там, но в конечном итоге получаю бесконечные $digest петли.
Идея состоит в том, чтобы установить ng-model = "$ someFieldToStoreInTheScope", а затем установить директиву getter/setter обновления между этим полем и функциями getter/setter.
Я использую $watch для обновления модели с использованием выражения setter, когда ngModelController обновляет поле в области, а другой смотрит, чтобы обновить это поле при изменении выражения getter.
Посмотрите: 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);
}
Я поместил setInterval() в свой код, чтобы изменить модель и посмотреть, правильно ли она распространяется в представлении.
Любая идея, почему существует бесконечный цикл дайджеста и как его удалить?