2016-07-20 6 views
1

ich den folgenden Code haben:

angular.module("MyApp", ['textAngular']) 
.controller("demoController", function demoController($scope) { 
    $scope.content = null; 
    firebase.database().ref('pages/home').on('value', function(snapshot) { $scope.content = snapshot.val(); }); 
    console.log($scope.content); 
}); 

Wie Sie sehen können, alles, was ich zu tun versuche, ist eine Variable im Rahmen meiner Controller ändern innerhalb einer Funktion, die auf die Firebase-Datenbank zugreift, um den Inhalt eines bestimmten Eintrags zu speichern. Bei diesem Versuch ändert sich die Variable jedoch einfach nicht. Ich habe das gleiche mit 'window.content' versucht, und versuche 'var content' zu verwenden. umsonst. Gibt es eine Möglichkeit, auf eine Variable global von einer Funktion aus zuzugreifen?

bearbeiten - Wenn ich die firebase.database() ausführen. Ref function und alert verwenden (snapshot.val()); es funktioniert und die Information wird in der Warnung angezeigt.

Antwort

1

Keine dieser Methoden gearbeitet, aber ich am Ende, indem Sie das Problem lösen up:

var app = angular.module("textAngularDemo", ['textAngular']) 
app.controller("demoController", function demoController($scope) { 
    firebase.database().ref('pages/home').on('value', function(snapshot) {  
     test($scope, snapshot.val()); 
    }); 
    $scope.detectChange = function(){ 
     setTimeout(function(){ 
      if ($scope.content) 
      { 
       console.log ($scope.content); 
       } 
      } 
      else 
      { 
       $scope.detectChange(); 
      } 
     }, 1); 
    } 
    function test(scope, variable){ 
     scope.content = variable; 
     $scope.$apply(); 
    } 
    setTimeout(function(){ $scope.detectChange() }, 1); 
}); 

Ich glaube, das ist verhält sich wie ein Versprechen, aber ich wusste nicht, wie ich sie umsetzen sollte. Nennen Sie das ein "Pseudoversprechen", wenn Sie so wollen.

1

Firebase ist asynchron, (dh der Rest des Codes ohne Warten auf die Feuerbasis Funktion laufen zu laufen. Legen Sie die console.log innerhalb der auf Funktion, werden Sie sehen, dass der Umfang Variable in der Tat hat sich geändert.

4

Verwendung $apply():

$apply() wird verwendet, um einen Ausdruck in Winkeln von außerhalb der der Winkelrahmen (zum Beispiel von Browser DOM Ereignissen, setTimeout, XHR oder drittes libraries) auszuführen

.

Zum Beispiel:

firebase.database() 
    .ref('pages/home') 
    .on('value', function(snapshot) {  
    $scope.$apply(function(){ 
     $scope.content = snapshot.val(); 
    }); 
}); 
+0

Wenn Sie dies versuchen, wird die Variable immer noch nicht erkannt und gibt null zurück, wenn sie protokolliert wird. – WebGavDev

0

Versuchen Sie, diese

firebase.database().ref('pages/home').on('value', function(snapshot) {  scope.$apply(function(){$scope.content = snapshot.val().content });}); 
Verwandte Themen