Поддержка получения и установки с помощью ng-модели в AngularJs
Я пытаюсь получить поддержку получения / установки для ng-модели путем реализации директивы, которая позаботится о получении и установке значений в / из представления / модели. Я почти на месте, но в итоге получаю бесконечные циклы $ digest.
Идея состоит в том, чтобы установить ng-model = "$ SomeFieldToStoreInTheScope»и затем сделайте так, чтобы директива getter / setter выполняла обновления между этим полем и функциями getter / setter.
Я использую $ watch, чтобы обновить модель, используя выражение setter, когда ngModelController обновляет поле в области, и другой watch, чтобы обновить это поле, когда изменяется выражение getter.
Посмотри на:http://jsfiddle.net/BDyAs/10/
Html:
{{myDerivedValue}}
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 () в своем коде, чтобы изменить модель и посмотреть, правильно ли она распространяется в представлении.
Есть идеи, почему существует бесконечный цикл дайджеста и как его убрать?