Копировать значение из объекта области видимости в директиве

#javascript #angularjs #angularjs-directive #angularjs-scope

#javascript #angularjs #angularjs-директива #angularjs-область видимости

Вопрос:

У меня есть директива, в которой я считываю значения как атрибуты и сохраняю их в области видимости. Моя разметка выглядит следующим образом:

 <my-directive
        ng-model="myCtrl.widgets"
        widget-amount="myCtrl.widgets"
        sprocket-amount="myCtrl.sprockets">
</my-directive>
  

и моя директива определяется как:

         return {
            scope: {
                widgetAmount                : '=',
                sprocketAmount              : '=',
                ....
  

Затем директива позволяет пользователю изменять размер виджета.

Проблема, с которой я сталкиваюсь, заключается в том, что в моем коде директивы я хочу выполнить некоторые вычисления с ИСХОДНЫМ значением виджета amount, но, похоже, я не могу сохранить это значение. Я пытался angular.copy безрезультатно. Кажется, что он просто возвращает мне копию, которая также изменяется вместе со значением в директиве. Как я могу просто получить исходное значение этой переменной, в то же время сохраняя двустороннюю привязку?

Комментарии:

1. angular.copy сохранит любые специальные угловые значения, такие как $$hashKey — которые будут действовать как указатель на исходную переменную. Вы можете использовать JSON.parse(JSON.stringify(variable)); для его клонирования без этих значений или использовать _.clone , если вы используете underscore.js .

2. Отлично, я этого не знал. Спасибо.

Ответ №1:

Надеюсь, я правильно интерпретирую это.

Пример использования

Сохранить исходное значение ограниченного в двух направлениях значения в директиве.

Решение

Вы можете использовать контроллер директивы для сохранения этого значения.

Код

 function myDirective() {
    return {
        scope: {
            widgetAmount: '=',
            sprocketAmount: '='
        },
        ...
        controller: function($scope) {
            // Retain the original value
            $scope.original = $scope.widgetAmount;

            // Modify the widgetAmount
            $scope.widgetAmount *= 2;
        }
    };
};
  

Пример

Демонстрация JSFiddle

HTML шаблон

 <div ng-app="app">
    <div ng-controller="ctrl">
        <my-directive
            ng-model="myCtrl.widgets"
            widget-amount="myCtrl.widgets"
            sprocket-amount="myCtrl.sprockets">
        </my-directive>
    </div>
</div>
  

Угловой код

 angular.module('app', [])
       .directive('myDirective', myDirective);

function ctrl($scope) {
    $scope.myCtrl = {
        widgets : 5,
        sprockets : 10
    }
}

function myDirective() {
    return {
        restrict: 'E',
        scope: {
            widgetAmount: '=',
            sprocketAmount: '='
        },
        template: '<pre>{{ original }} {{ widgetAmount }} {{ sprocketAmount }}</pre>',
        controller: function($scope) {
            $scope.original = $scope.widgetAmount;

            $scope.widgetAmount *= 2;
        }
    };
};
  

Комментарии:

1. Да, вы интерпретируете это правильно. Ваш ответ не работает для меня, НО он привел меня к правильному способу сделать это. Я использую функцию компиляции и публикации в своей директиве, поэтому часть контроллера была немного запутанной. Однако ваш ответ заставил меня подумать, что я должен сохранить значение на другом этапе или, по крайней мере, ранее в моем коде, так что спасибо.