Ответ 1
Вы можете попробовать добавить ng-model-options="{updateOn : 'change blur'}"
в свой тег ввода. Должен работать.
У меня есть это поле ввода, которое я использую для поиска:
<input id="search_input" type="text" ng-model="filter.search_terms">
Есть много других фильтров, которые я использую (флажки, радио и т.д.), и у меня есть фильтр $watch on filter, поэтому любые изменения будут запускать поиск. Проблема в том, что я не хочу, чтобы поиск запускался для текстового поля каждый раз, когда я печатаю письмо, и хочу только "сохранить" его на filter.search_terms только после нажатия клавиши ввода.
Есть ли простой способ сделать это или мне нужно удалить ng-модель и сделать ng-click с помощью функции, которая устанавливает его при вводе?
Вы можете попробовать добавить ng-model-options="{updateOn : 'change blur'}"
в свой тег ввода. Должен работать.
Ни один из ответов здесь, похоже, не полностью отвечает на вопрос. Вопрос состоял в том, как заставить модель обновлять ТОЛЬКО при нажатии enter. Я уверен, что исходный плакат продвинулся, но для других, кто может это найти, я добавлю свой подход. Я думаю, что ninjaPixel получил самое близкое. Мой ответ основан на его директиве.
Однако недостающий элемент не позволяет директиве ng-model по умолчанию обновляться в других случаях. Чтобы сделать это, я добавил параметр для ввода для обновления на клавиатуре:
ng-model-options="{updateOn: 'keyup'}"
Это переопределяет значение по умолчанию, которое обновляет входные события (для текстовых полей) и заставляет обновление возникать при активации клавиатуры. Это позволяет нашей директиве предотвращать исходное действие по умолчанию для ng-model, останавливая распространение события в нашем пользовательском обработчике ключей:
if (ev.keyCode !== 13) return ev.stopImmediatePropagation();
Рабочий код можно найти здесь: http://codepen.io/jessehouchins/pen/MbmEgM
Вы можете добиться этого, создав директиву под названием updateOnEnter
, а затем добавив этот атрибут в свой HTML-элемент.
<input id="search_input" type="text" update-on-enter ng-model="filter.search_terms">
angular.module('app').directive('updateOnEnter', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, element, attrs, ctrl) {
element.on("keyup", function(ev) {
if (ev.keyCode == 13) {
ctrl.$commitViewValue();
scope.$apply(ctrl.$setTouched);
}
});
}
}
});