Próbuję zwrócić pojedynczy rekord z obietnicy w AngularJs (1.0.7) i powiązać wynik z formularzem. Formularz jest poprawnie powiązany, ale pola wejściowe są tylko do odczytu - nie mogę edytować wartości.
Jeśli zamiast tego zawijam rekord w tablicy i iteruję za pomocą polecenia ng: repeat, formularz jest poprawnie powiązany i mogę edytować wartości.
Utworzyłem plnkr który demonstruje kwestię jasno:
http://embed.plnkr.co/fOWyhVUfekRbKUSRf7ut/preview
można edytować bezpośrednio związany i list związany pól wejściowych, jednak pole związany z pojedynczym obietnicy nie może być edytowany.
Czy można powiązać ng: model bezpośrednio z obiektem zwróconym przez obietnicę, czy też muszę użyć tablicy, aby to zadziałało?
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: Po pewnym debugowania, Znalazłem, że ng: dyrektywa model jest czytanie od wartości („$$ v”) składnik obietnicy, ale pisząc bezpośrednio do obietnicy sam obiekt.
Przy próbie edycji obietnicy, ViewModel powraca do pierwotnej wartości, zachowując znaki w samej obietnicy. Tak więc jeśli użytkownik wpisze "asdf" do pola wejściowego, wynik będzie następujący.
{Name: "Asdf", $$v: {Name: "Bill Gates"}}
Zważywszy powinniśmy zamiast oczekiwać
{$$v: {Name: "asdf"}}
Czy robię coś źle, czy też jest to potencjalnie błąd w angularjs?
(w celu dalszego wyjaśnienia, problem polega różnica w działaniu pomiędzy tablicą i obiektu zwróconej obietnicą. Bezpośrednie Wiązanie to jest jako próbka kontrolna),
znalazłem problem i stworzyły żądania ciągnąć. https://github.com/angular/angular.js/pull/2854 –