2016-03-20 24 views
0

Açısal denetleyicide bir Firebase işlev var. Orada tıklandığında bir düğme seçilen opsiyon ve benzeri gibi kullanıcının nesnesine türü giriş ve depolar yeterli:Firebase işlevi görünüm değişene kadar çalışmıyor

{ 
    selected-option : input-value 
} 

Bu mükemmel çalışıyor, ancak yalnızca görünüm değiştirildiğinde çalışır. Benim durumumda her iki havayolunda da veri var, bu yüzden bu fonksiyon bir $ iyonicPopup gösteriyor. İşlev tamamen kusursuz olduktan sonra görünüm değiştikten sonra. Bu açıkçası bir problem ve bunun bir $ apply veya $ digest sorunu olduğunu varsayalım.

İşte benim denetleyicisi kodu ("SAĞ BURAYA SAYI" damgasını Supected konumu) 'dir: Yardım için

.controller('ProgramCtrl', ['$scope', '$state', '$firebaseArray', 'facebook', '$ionicPopup', '$ionicLoading', 
function($scope, $state, $firebaseArray, facebook, $ionicPopup, $ionicLoading) { 
$scope.goBack = function() { 
    $state.go('app.home'); 
} 

$scope.show = function() { 
    $ionicLoading.show({ 
     template: 'Loading...' 
    }); 
}; 
$scope.hide = function(){ 
    $ionicLoading.hide(); 
}; 

// Get who is logged in 
$scope.user = facebook.get(); 

// Array of airlines 
var airRef = ref.child("airlines"); 
$scope.airlines = $firebaseArray(airRef); 
$scope.selectedAir = {}; 
$scope.miles = {}; 

$scope.revealInput = function(num) { 
    // Jquery variables 
    $milesPoints = $(".milesPoints"); 
    $saveTicket = $(".saveTicket"); 
    // Will fade in visibility depending on num passed into function 
    switch(num) { 
     case 1: 
      $saveTicket.prop("disabled", false); 
      $saveTicket.fadeTo(400, 1); 
      break; 
     default: 
      break; 
    } 
} 

// Add program to user 
$scope.addProgram = function() { 
    // Connect to Firebase 
    Firebase.goOnline(); 
    // Check for facebook user 
    if(jQuery.isEmptyObject($scope.user)) { 
     // Get Firebase user 
     var authData = ref.getAuth(); 
     var theUser = ref.child("users").child(authData.uid); 
     var selected = {}; 
     // Access user miles data 
     // $scope.show(); 
     // ISSUE RIGHT HERE  
    theUser.child("miles").child($scope.selectedAir.name.$id).once("value", function(snapshot) { 
      // Update scopes 
       var exist = snapshot.exists(); 
       // Check if object id exists, if so notify user 
       if(!exist) { 
        // Save and update program to user object 
        selected[$scope.selectedAir.name.$id] = $scope.miles.num; 
        theUser.child("miles").update(selected); 
        //$scope.hide(); 
        $state.go("app.saved"); 
       } else { 
        // Popup alert 
        var alertPopup = $ionicPopup.alert({ 
        title: 'Oops!', 
        template: "You already created this airline! Go to the 'Add Ticket' page to add more points." 
        }); 
        alertPopup.then(function(res) { 
        console.log("You already created this airline! Go to the 'Add Ticket' page to add more points."); 
        }); 
       } 
     }) 

    } else { 
     var theUser = ref.child("users").child($scope.user.id); 
     var selected = {}; 
     $scope.show(); 
     theUser.child("miles").child($scope.selectedAir.name.$id).once("value", function(snapshot) { 
      var exist = snapshot.exists(); 
      if(!exist) { 
       selected[$scope.selectedAir.name.$id] = $scope.miles.num; 
       theUser.child("miles").update(selected); 
       $scope.hide(); 
       $state.go("app.saved"); 
      } else { 
       var alertPopup = $ionicPopup.alert({ 
       title: 'Oops!', 
       template: "You already created this airline! Go to the 'Add Ticket' page to add more points." 
       }); 
       alertPopup.then(function(res) { 
       console.log("You already created this airline! Go to the 'Add Ticket' page to add more points."); 
       }); 
      } 
     }) 

    } 
    } 
    }]) 

Teşekkür ve gerekirse daha fazla kod veya ekran görüntülerini sağlayabilir.

cevap

2

konu bu kod parçasının içinde: Firebase dan

theUser.child("miles").child($scope.selectedAir.name.$id).once("value", function(snapshot) { 
    $timout(function() { 
      var exist = snapshot.exists(); 
      // Check if object id exists, if so notify user 
      if(!exist) { 
       // Save and update program to user object 
       selected[$scope.selectedAir.name.$id] = $scope.miles.num; 
       theUser.child("miles").update(selected); 
       //$scope.hide(); 
       $state.go("app.saved"); 
      } else { 
       // Popup alert 
       var alertPopup = $ionicPopup.alert({ 
       title: 'Oops!', 
       template: "You already created this airline! Go to the 'Add Ticket' page to add more points." 
       }); 
       alertPopup.then(function(res) { 
       console.log("You already created this airline! Go to the 'Add Ticket' page to add more points."); 
       }); 
      } 
    }); 
}) 

Eğer once() diyoruz

, bu başlar yükleme verileri. Bu biraz zaman alabileceğinden, veriler kullanılabilir olduğunda çağrılan bir geri arama işlevini iletirsiniz. Ama geri arama işlevi çağrıldığında, AngularJS artık $scope güncellemelerini beklemiyor.

çözüm yine angularjs kapsamını idare etmeye hazır olduğunda işletilirse sağlayan $timeout() içine kod, kaydırmak için değişiklikleri şudur: Bu sorun kullandığınız takdirde neler olmaz

theUser.child("miles").child($scope.selectedAir.name.$id).once("value", function(snapshot) { 
     // Update scopes 
      var exist = snapshot.exists(); 
      // Check if object id exists, if so notify user 
      if(!exist) { 
       // Save and update program to user object 
       selected[$scope.selectedAir.name.$id] = $scope.miles.num; 
       theUser.child("miles").update(selected); 
       //$scope.hide(); 
       $state.go("app.saved"); 
      } else { 
       // Popup alert 
       var alertPopup = $ionicPopup.alert({ 
       title: 'Oops!', 
       template: "You already created this airline! Go to the 'Add Ticket' page to add more points." 
       }); 
       alertPopup.then(function(res) { 
       console.log("You already created this airline! Go to the 'Add Ticket' page to add more points."); 
       }); 
      } 
    }) 

Not AngularFire en $firebaseObject() ve $firebaseArray() ilkel, bunlar otomatik olarak AngularJS kapsam değişikliklerini bildirir.

Bu soruyu çok alırsınız. İşte son bir: Taking long to load

+0

Firebase + Angular'in ince ayrıntılarını hala belirterek teşekkürler. – theblindprophet

İlgili konular