Ich verwende $ rootScope. $ On in einem Controller, um auf ein Ereignis zu hören, das von einem Modul ausgegeben wird, das ich verwende (angular-patiery). Es funktioniert, dass es das Ereignis bekommt & Ich kann Sachen auf den "Argumenten" durchführen. Aber ich möchte das Objekt args in eine Objektvariable schreiben, die außerhalb des Bereichs der Listener-Funktion deklariert ist. Ich kann nicht den folgenden Code an die Arbeit:
(function() {
'use strict';
angular
.module('app')
.controller('searchSpeakersResultsCtrl', searchSpeakersResultsCtrl);
searchSpeakersResultsCtrl.$inject = ['$rootScope', '$scope'];
function searchSpeakersResultsCtrl($rootScope, $scope) {
var vm = $scope;
var pckry = {};
var packeryEventListener = function (event, args) {
pckry = args;
console.log(pckry);
}
var unbind = $rootScope.$on('packeryInstantiated', packeryEventListener);
console.log(pckry);
vm.$on('$destroy', unbind);
}
})();
Die console.log innerhalb der Listener-Funktion den richtigen Wert gibt, gibt die console.log außerhalb der Funktion das leere Objekt mit var pckry erstellt = {} ;.
Wie jedoch erwartet wird, aktualisiert die direkte Verwendung der Funktion packeryEventListener (nicht aus $ rootScope. $ On) den Wert von pckry außerhalb der Funktion packeryEventListener.
Was könnte ich vermissen? Scheint so, als ob die grundlegenden JavaScript-Variablen für den Umfang nicht funktionieren, wenn sie mit $ rootScope. $ On verwendet werden. Cheers, H.
Ihr Problem hier ist einfach eines der Zeit: Das 'console.log', das ein leeres Objekt sieht, wird ausgelöst, bevor der Callback die Variable auffüllt. Denken Sie daran, dass angular eine sehr asynchrone Umgebung ist: Callbacks passieren immer später als Sie denken. – Duncan
Duncan, wow! Ich wickelte die äußere console.log in einem Timeout und es hat funktioniert! $ Timeout (function() { \t \t \t \t console.log (pckry); \t \t \t}, 0); Also, kurze Frage: Was ist eine gute Art damit zu arbeiten? Muss ich den gesamten Code außerhalb der Listener-Funktion innerhalb eines Timeouts einbinden, oder? . . ? –
oder verschieben Sie es in den Rückruf, oder lesen Sie Versprechen und beginnen Sie, sie überall zu verwenden. – Duncan