Поддержка получения и установки с помощью 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 () в своем коде, чтобы изменить модель и посмотреть, правильно ли она распространяется в представлении.

Есть идеи, почему существует бесконечный цикл дайджеста и как его убрать?

Ответы на вопрос(2)

Ваш ответ на вопрос