Sto tentando di restituire un singolo record da una promessa in AngularJs (1.0.7) e associare il risultato a un modulo. Il modulo si collega correttamente, tuttavia i campi di input sono di sola lettura - Non riesco a modificare i valori.
Se invece avvolgo il record in un array e iterato utilizzando ng: repeat, il modulo si collega correttamente e posso modificare i valori.
ho creato un plnkr che dimostra chiaramente il problema:
http://embed.plnkr.co/fOWyhVUfekRbKUSRf7ut/preview
È possibile modificare l'elenco legato campi di input direttamente legati e, tuttavia il campo associato al singolo promessa non può essere modificato.
È possibile associare ng: model direttamente a un oggetto restituito da una promessa oppure è necessario utilizzare un array per farlo funzionare?
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: Dopo un po 'di debug, ho trovato che il ng: direttiva modello è lettura dal valore ('$$ v'), componente della promessa, ma scrivendo direttamente alla promessa oggetto stesso.
Quando si tenta di modificare la promessa, ViewModel continua a ritornare al valore originale, mentre memorizza i caratteri sulla promessa stessa. Quindi se l'utente digita 'asdf' nel campo di input, il risultato sarebbe il seguente.
{Name: "Asdf", $$v: {Name: "Bill Gates"}}
Mentre dovremmo invece aspettarci
{$$v: {Name: "asdf"}}
Sto facendo qualcosa di sbagliato, o è questo potenzialmente un bug in AngularJS?
(Per chiarire ulteriormente, il problema è la differenza di comportamento tra un array e un oggetto restituito da una promessa. Il legame diretto è semplicemente lì come controllo)
ho trovato il problema e hanno creato una richiesta di pull. https://github.com/angular/angular.js/pull/2854 –