Я пытаюсь вернуть единую запись из обещания в AngularJs (1.0.7) и привязать результат к форме. Форма правильно связывается, однако поля ввода доступны только для чтения - я не могу редактировать значения.
Если вместо этого я завершаю запись в массиве и повторяю с помощью ng: repeat, форма связывается правильно, и я могу редактировать значения.
Я создал plnkr, который демонстрирует проблему ясно:
http://embed.plnkr.co/fOWyhVUfekRbKUSRf7ut/preview
Вы можете редактировать непосредственно связанные и список связаны поля ввода, однако поле привязывается к одной обещанию не может быть изменен.
Можно ли привязать ng: model непосредственно к объекту, возвращенному из обещания, или мне нужно использовать массив, чтобы заставить это работать?
app.controller('MainCtrl', function($scope, $timeout, $q) {
var person = {"name": "Bill Gates"}
var deferList = $q.defer();
var deferSingle = $q.defer();
// Bind the person object directly to the scope. This is editable.
$scope.direct = person;
// Bind a promise to the scope that will return a list of people. This is editable.
$scope.list = deferList.promise;
// Bind ap romise to the scope that will return a single person record. This is *not* editable.
$scope.single = deferSingle.promise;
// Resolve the promises
$timeout(function(){
deferList.resolve([person]); // Array
deferSingle.resolve(person); // Just the record itself
}, 100);
});
<body ng-controller="MainCtrl">
Directly Bound - This field is editable
<input ng:model="direct.name"/>
<hr/>
Singleton Promise - This field is *not* editable.
<input ng:model="single.name"/>
<hr/>
List Promise: - This field is editable
<div ng:repeat="person in list">
<input ng:model="person.name"/>
</div>
</body>
Edit: После некоторой отладки, я обнаружил, что нг: директива модель чтение от значения («$$ V») компонент обетования, но писать непосредственно на обещание сам объект.
При попытке отредактировать обещание ViewModel продолжает возвращаться к исходному значению при сохранении символов в самом обещании. Таким образом, если пользователь вводит «asdf» в поле ввода, результатом будет следующее.
{Name: "Asdf", $$v: {Name: "Bill Gates"}}
В то время как мы должны вместо этого ожидать
{$$v: {Name: "asdf"}}
Я делаю что-то неправильно, или это потенциально ошибка в AngularJS?
(В целях дальнейшего уточнения, этот вопрос является различие в поведении между массивом и объект, возвращаемый обещание. Непосредственное связывание просто есть в качестве контроля)
Я нашел эту проблему и создал запрос тянуть. https://github.com/angular/angular.js/pull/2854 –