2013-05-09 6 views
7

के साथ FireBaseAuthClient का उपयोग करते समय मैं एक कोणीय जेएस स्कोप में लॉग इन उपयोगकर्ता को रिकॉर्ड करने का प्रयास कर रहा हूं, लेकिन पृष्ठ को पहले लोड होने पर त्रुटि प्राप्त हो रही है।

"लॉगिन" पर क्लिक करने के लिए काम करना प्रतीत होता है, लेकिन उसके बाद उसी "$ लागू हो रहा है" त्रुटि के साथ लॉगआउट बेल्स।

मुझे उम्मीद है कि मैंने अभी गलत समझा है कि $apply काम करता है, क्या कोई मदद कर सकता है?

अद्यतन:

यह सहजता से चलता है कि अगर मैं $apply() में सिर्फ if (user) हिस्सा लपेट इस प्रकार है।

var auth = new FirebaseAuthClient(ref, function(error, user) { 
    if (user) { 
     $scope.$apply(function(){ $scope.user = user; }); 
     console.log(user); 
    } else if (error) { 
     // I can't vouch for this, haven't tested it 
     $scope.$apply(function(){ $scope.user = null; }); 
     console.log(error); 
    } else { 
     $scope.user = null; 
     console.log("logged out"); 
    } 
}); 

मूल कोड:

app.js:

var app = angular.module('app', ['firebase']); 

controller.js:

app.controller('Login', ['$scope', 'angularFire', 
function($scope, angularFire) { 
    $scope.loginstatus = 'logged out'; 

    var ref = new Firebase("https://app.firebaseio.com/"); 
    var auth = new FirebaseAuthClient(ref, function(error, user) { 
     if (user) { 
      $scope.$apply(function(){ $scope.loginstatus = 'logged in'; }); 
     } else if (error) { 
      $scope.$apply(function(){ $scope.loginstatus = 'error'; }); 
      alert("Login error: " + error); 
     } else { 
      $scope.$apply(function(){ $scope.loginstatus = 'logged out'; }); 
     } 
    }); 

    $scope.login = function(provider, args) { 
     auth.login(provider, args); 
    } 

    $scope.logout = function() { 
     auth.logout(); 
    } 
}]); 

index.html:

<!DOCTYPE html> 
<html lang="en" ng-app="app"> 
<head> 
    <meta charset="utf-8"> 
    <title>App</title> 
    <script type="text/javascript" src="https://cdn.firebase.com/v0/firebase.js"> 
    <script type="text/javascript" src='https://cdn.firebase.com/v0/firebase-auth-client.js'></script></script> 
    <script type="text/javascript" src="lib/angular/angular.js"></script> 
    <script type="text/javascript" src="lib/angularFire.js"></script> 
    <script type="text/javascript" src="js/app.js"></script> 
    <script type="text/javascript" src="js/controllers.js"></script> 
</head> 
<body ng-controller="Login"> 
    <p>Login status: {{loginstatus}}</p> 
    <div class="container"> 
     <h1>Login</h1> 
     <p> 
     <button ng-hide="user" ng-click="login('twitter')" class="btn btn-primary btn-large">Login</button> 
     <button ng-show="user" ng-click="logout()" class="btn btn-primary btn-large">Logout</button> 
     </p> 
    </div> 
</body> 
</html> 

उत्तर

1

$apply केवल तभी जरूरी है जब आप कोणीय के संदर्भ के बाहर हों (जैसे सेटटाइमआउट, सेट इंटरवल, या गैर-कोणीय एक्सएचआर कॉलबैक)।

चूंकि FireBaseAuthClient एक उपकरण है जो कोणीय के साथ लिखा गया है और आपके नियंत्रक में इंजेक्शन दिया गया है, तो संभव है कि कॉलबैक पहले से ही $scope.$apply में लपेटा गया हो। आप $scope.$apply को हटाकर अपना कोड ठीक कर सकते हैं, इसलिए बस:

var ref = new Firebase("https://app.firebaseio.com/"); 
var auth = new FirebaseAuthClient(ref, function(error, user) { 
    if (user) { 
     $scope.loginstatus = 'logged in'; 
    } else if (error) { 
     $scope.loginstatus = 'error'; 
     alert("Login error: " + error); 
    } else { 
     $scope.loginstatus = 'logged out'; 
    } 
}); 
+0

उत्तर के लिए चीयर्स लेकिन यह काम नहीं करता है। यही मुझे शुरू करना था। कॉलबैक काम करता है क्योंकि मैं इसे कंसोल आउटपुट देख सकता हूं अगर मैं इसे वहां घुमाता हूं, लेकिन '$ स्कोप 'अपडेट नहीं होता है। यह "कोणीय के अंदर" होने का लक्षण नहीं है, इसलिए मैंने '$ आवेदन()' के साथ झुकाव क्यों शुरू किया। –

+0

यह काम करता है अगर मैं सिर्फ "लॉग इन" तर्क लपेटता हूं और आपके ऊपर जैसा लॉगआउट तर्क छोड़ देता है। अद्यतन के लिए मेरा मूल प्रश्न देखें। –

+0

कहा जा रहा है कि, आपको '' वादा 'में $ आवेदन का उपयोग करने की आवश्यकता हो सकती है। बस एक एफवाईआई। –

संबंधित मुद्दे