Istotne skrzypce: https://jsfiddle.net/tqf4zea7/1/
Używam $ q w kątowym kontrolera. Aby przetestować kilka scenariuszy, stworzyłem tablicę zakresu naciskać wiadomości:
$scope.messages = [];
mam skonfigurować funkcję, która zwraca $ q funkcję jako tak:
function returnAPromise(valToReturn){
return $q(function(resolve, reject){
$timeout(function(){
resolve(valToReturn);
}, 500);
});
}
Mam następnie .then()
wezwanie na wynik, który wygląda tak:
returnAPromise('third').then($scope.messages.push);
od kiedy tylko chcą pchnąć wartość, że obietnica została rozwiązana z do tablicy, pomyślałem, może po prostu przejść się po naciśnięciu spotkał hod tablicy komunikatów, ale kiedy to zrobić, pojawia się następujący błąd:
VM289 angular.js:12520 TypeError: Array.prototype.push called on null or undefined
at processQueue (VM289 angular.js:14792)
at VM289 angular.js:14808
at Scope.$eval (VM289 angular.js:16052)
at Scope.$digest (VM289 angular.js:15870)
at Scope.$apply (VM289 angular.js:16160)
at VM289 angular.js:17927
at completeOutstandingRequest (VM289 angular.js:5552)
at VM289 angular.js:5829
Jeśli Załączam pchnięcie w funkcji, to działa dobrze:
returnAPromise('third').then(function(message){
$scope.messages.push(message)
});
Czy to zamknięcie Wydanie I nie rozumiesz?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind sekcja Przykłady opisuje problem i dlaczego .bind() rozwiązuje go.Niestety zawiera ona wiersz "Częsty błąd dla nowych programistów JavaScript". = [Zostałem zdegradowany. – sonicblis