В моей модели у меня есть поле, в котором мне нужно несколько элементов управления для привязки. Одним из этих элементов управления является текстовое поле. Текстовое поле не должно напрямую редактировать поле, но вместо этого оно должно позволить пользователю вводить, а затем либо фиксировать изменения, либо отменять. Если какая-либо другая операция выполняется, она должна перезаписать любые изменения в текстовом поле. Одним из ограничений является наличие других компонентов пользовательского интерфейса, которые изменяют значение и не имеют доступа к локальной области.Как реализовать разрешаемое редактируемое поле в Angular?
Я реализовал желаемое поведение с директивой: http://jsfiddle.net/fLxjjmb7/3/
Он работает, как задумано, но я чувствую, что должен быть лучший способ сделать это. Есть идеи?
<div ng-app="app" ng-controller="controller">
<div>{{foo}}</div>
<button ng-click="increment()">increment</button>
<button ng-click="decrement()">decrement</button>
<br />
<div shadow="foo">
<input type="text" ng-model="foo" />
<button ng-click="commit()">update</button>
<button ng-click="cancel()">cancel</button>
</div>
</div>
var app = angular.module('app', []);
var controller = app.controller('controller', function ($scope) {
$scope.foo = 1;
$scope.increment = function() { ++$scope.foo; };
$scope.decrement = function() { --$scope.foo; };
});
var directive = app.directive('shadow', function() {
return {
scope: true,
link: function(scope, el, att) {
scope.$parent.$watch(att.shadow, function (newValue) {
scope[att.shadow] = newValue;
});
scope.commit = function() {
scope.$parent[att.shadow] = angular.copy(scope[att.shadow]);
};
scope.cancel = function() {
scope[att.shadow] = angular.copy(scope.$parent[att.shadow]);
};
}
};
});
Хорошая идея. Я должен был упомянуть, что другие компоненты пользовательского интерфейса могут также изменить значение. У них нет доступа для отмены или других локальных функций области. – fixedpoint
Хорошо, если компоненты вне контроллера могут изменить значение, которое вы могли бы поместить логику get/set на заводе. Если объект данных хранится на заводе, метод «get» возвращает полный объект данных, а «set» изменяет data.original - вы должны быть золотыми. Мог бы добавить еще одного слушателя в контроллер, хотя для отслеживания изменений, сделанных в оригинале снаружи, вызовите $ scope.reset(), если это произойдет. –