Ответ 1
Из google forums:
Проблема заключается в том, что при каждом изменении объекта модели ng-repeat восстанавливает весь массив и, таким образом, размывает поле ввода. Что вам нужно сделать, это обернуть ваши строки в объекты
jsПримечание проблемы: http://jsfiddle.net/yoxigen/xxTJc/
Я создаю небольшую форму для редактирования всех свойств объекта. Для этого у меня есть ретранслятор для свойств. Каждое свойство имеет свой вклад:
<ul ng-controller="myController">
<li ng-repeat="(property, value) in obj">
<input ng-model="obj[property]"/><span>{{value}}</span>
</li>
</ul>
Каждый раз, когда клавиша нажата на входе, значение рядом с ней обновляется правильно, но вход теряет фокус. Любая идея, как это можно исправить?
Из google forums:
Проблема заключается в том, что при каждом изменении объекта модели ng-repeat восстанавливает весь массив и, таким образом, размывает поле ввода. Что вам нужно сделать, это обернуть ваши строки в объекты
Я хочу, чтобы был способ отложить регенерацию, пока я не закончил редактирования.
Возможно, вы сможете это сделать. Просто создайте настраиваемую директиву, которая взрывает события AngularJS и вместо этого выслушивает "изменение". Вот пример того, что может выглядеть так:
YourModule.directive('updateModelOnBlur', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elm, attr, ngModelCtrl)
{
if(attr.type === 'radio' || attr.type === 'checkbox')
{
return;
}
// Update model on blur only
elm.unbind('input').unbind('keydown').unbind('change');
var updateModel = function()
{
scope.$apply(function()
{
ngModelCtrl.$setViewValue(elm.val());
});
};
elm.bind('blur', updateModel);
// Not a textarea
if(elm[0].nodeName.toLowerCase() !== 'textarea')
{
// Update model on ENTER
elm.bind('keydown', function(e)
{
e.which == 13 && updateModel();
});
}
}
};
});
Затем на вашем входе:
<input type="text" ng-model="foo" update-model-on-blur />