#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;
}
};
};
Пример
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. Да, вы интерпретируете это правильно. Ваш ответ не работает для меня, НО он привел меня к правильному способу сделать это. Я использую функцию компиляции и публикации в своей директиве, поэтому часть контроллера была немного запутанной. Однако ваш ответ заставил меня подумать, что я должен сохранить значение на другом этапе или, по крайней мере, ранее в моем коде, так что спасибо.