2016-01-10 12 views
6

में वैश्विक चर बनाने के लिए कैसे करें मुझे यह समस्या है जब आप पंजीकरण करते हैं तो आप उपयोगकर्ता पेज पर जाते हैं। और उसके कहने के लिए "आपका स्वागत है" उपयोगकर्ता नाम के बारे में निश्चित नहीं कारण im के लिए वेब पेज पर के लिए दिखाई ... कृपया यहाँ मदद dosent लगता plunkr है:कोणीय जेएस

http://plnkr.co/edit/qB3Gkeq5ji1YQyy0kpGH?p=preview

कृपया मुझे मदद की जरूरत है ..

मैं plunker के लिए कुछ कोड प्राप्त करने की आवश्यकता है ताकि: script.js:

var app = angular.module('LoginApp', ["firebase", "ngRoute"]) 

app.config(function ($routeProvider) { 
    $routeProvider 
     .when('/', { 
     templateUrl: 'registration.html', 
     controller: 'AuthCtrl' 
     }) 
     .when('/logIn', { 
     templateUrl: 'login.html', 
     controller: 'AuthCtrl' 
     }) 

     .when('/User', { 
     templateUrl: "User.html", 
     controller: 'AuthCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/' 
     }); 


    }); 


app.factory("Auth", ["$firebaseAuth", 
    function($firebaseAuth) { 
    var ref = new Firebase("https://uniquecoders.firebaseio.com/"); 
    return $firebaseAuth(ref); 
    } 
]); 


app.controller("AuthCtrl", ["$scope", "Auth", 
    function($scope, Auth) { 


     $scope.createUser = function() { 

     $scope.message = null; 
     $scope.error = null; 
    var ref2 = new Firebase("https://uniquecoders.firebaseio.com/"); 
    ref2.createUser({ 
    email: $scope.email, 
    password: $scope.password 
    }, function(error, userData) { 
    if (error) { 
     switch (error.code) { 
     case "EMAIL_TAKEN": 
      alert("The new user account cannot be created because the email is already in use. Try to login"); 
      break; 
     case "INVALID_EMAIL": 
      alert("The specified email is not a valid email."); 
      break; 
     case "INVALID_PASSWORD": 
      alert("The Specified Passowrd Is not valid.") 
      break; 
     default: 
      alert("Error creating user:", error); 
     } 
    } else { 
     alert("Successfully created user account with uid:", userData.uid); 
     alert($scope.UserName) 

     window.location.hash = "/User" 
     $scope.usernames = "HEY" 
    } 
    }); 


     }; 

     $scope.logIn = function(){ 
     $scope.message = null; 
     $scope.error = null; 

     ref2.authWithPassword({ 
      "email" : $scope.logInemail, 
      "password" : $scope.logInemailpassword 

     }, function(error, userData){ 

      if(error){ 
      alert("Login Failed.") 
      console.log(error) 
      } 
      else{ 
      alert("Logged In!") 
      } 

     }) 

     } 

    /* $scope.removeUser = function() { 
     $scope.message = null; 
     $scope.error = null; 

     Auth.$removeUser({ 
     email: $scope.email, 
     password: $scope.password 
     }).then(function() { 
     $scope.message = "User removed"; 
     }).catch(function(error) { 
     $scope.error = error; 
     }); 
    };*/ 
    } 
]); 
+0

मैं तुम्हारे बारे में कोणीय अधिक अध्ययन की जरूरत लगता है: https://docs.angularjs.org/guide सेवाओं और दायरे के लिए देखो। –

+0

@ ViníciusFagundes क्या आप मुझे thoguh मदद कर सकते हैं? – amanuel2

+0

क्षमा करें। इस तरह का सवाल बंद होना चाहिए। इसका उत्तर देने के कई तरीके हैं। –

उत्तर

2

वहाँ अपने कोड में बहुत सी बातें है कि आप की देखभाल करने के लिए चाहते हो सकता है, लेकिन कुछ त्वरित और आंशिक रूप से गंदा समाधान:

अपने नेस्टेड टेम्पलेट्स पर अपने जावास्क्रिप्ट फ़ाइलों के सभी शामिल न करें। कुछ भी जो आपके ng-view में रूट किया गया है, वह HTML होना चाहिए जिसे आप <div> के भीतर डालना चाहते हैं। कोई सीएसएस लिंक नहीं, कोई स्क्रिप्ट टैग नहीं, HTML के अलावा कुछ भी नहीं जो आमतौर पर किसी पृष्ठ के शरीर के भीतर होगा।

अपने पंजीकरण पृष्ठ पर, आपके उपयोगकर्ता नाम ng-model को आपके ng-click पर तर्क के रूप में पारित करने की आवश्यकता है। तो ng-model="userName" के बजाय ng-click="createUser(username, email, password)" से मेल खाने के लिए आपको ng-model="username" होने की आवश्यकता है।

आपका अन्य प्रमुख मुद्दा यह है कि प्रत्येक बार जब आप दृश्य बदलते हैं तो $scope ओवरराइट किया जा रहा है क्योंकि आपके प्रत्येक मार्ग में एक ही नियंत्रक होता है। तो अवधारणात्मक रूप से, आप सोच रहे होंगे कि username (जिसे आपने कुछ कारणों से बहुवचन $scope.usernames के रूप में संग्रहीत किया है) अभी भी $scope पर पहुंचने के लिए है। लेकिन ऐसा नहीं है, क्योंकि प्रत्येक दृश्य ऑथ कंट्रोलर के अपने अनूठे उदाहरण पर चल रहा है। सबसे तेज़ समाधान क्योंकि आप सेवाओं को कार्यान्वित करने के बारे में नहीं जानते हैं, शायद $rootScope को अपने नियंत्रक में इंजेक्ट करना है, और $scope पर $rootScope पर $rootScope पर रखें (हालांकि $rootScope का उपयोग करके ध्यान में रखना बुरा अभ्यास माना जाता है), क्योंकि रूट रूटस्कोप अपने सभी नियंत्रकों में बने रहें।तो अपने जावास्क्रिप्ट फ़ाइल अधिक इस प्रकार दिखाई देगा:

app.controller("AuthCtrl", ["$scope", "$rootScope", "Auth", function($scope, $rootScope, Auth) {

और फिर

$scope.createUser = function(username, email, password) { $rootScope.usernames = username $scope.message = null; $scope.error = null;

+0

लंबे समय तक, आप सीखना चाहेंगे कि रूटस्कोप की बजाय सेवाओं का उपयोग कैसे करें। संक्षेप में, आप यह सुनिश्चित करना चाहते हैं कि आपके प्रत्येक विचार में एक अलग नियंत्रक है। –

+0

बहुत धन्यवाद पी एकरमैन। आपका जीवन बचाओ यह काम किया! क्या आपके पास कोई अन्य सुझाव है? मैं वर्तमान में एक लॉगिन/पंजीकरण के साथ एक todo सूची वेबसाइट बना रहा हूँ। – amanuel2

+0

और यदि यह आपको परेशान करता है तो आप पी एकरमैन को जानते हैं कि आप केवल एक विशिष्ट उपयोगकर्ता के लिए डेटा को कैसे कार्यान्वित करना चाहते हैं? आपको बहुत - बहुत धन्यवाद! – amanuel2

1

जब आप उपयोगकर्ता दृश्य कोणीय पर नेविगेट AuthCtrl नियंत्रक, जो नए गुंजाइश मतलब का नया उदाहरण बनाता है, कि कोई क्यों देखते हैं valu ई वहाँ

नियंत्रकों के बीच डेटा (या यहां तक ​​कि दायरा) साझा करने के लिए सेवाओं का उपयोग करें।

3

जब आपका ऐप मार्ग बदलता है, तो यह पुराने नियंत्रक के दायरे को नष्ट कर देता है और एक नया दायरा बनाता है। यह तब भी होता है जब आप पुराने और नए मार्ग दोनों के लिए एक ही नियंत्रक का उपयोग करते हैं।

उस डेटा को बनाने वाले कार्यों के साथ आपके Auth फैक्ट्री में लगातार डेटा स्टोर करें।

app.factory("Auth", ["$firebaseAuth", 
    function($firebaseAuth) { 
    var AuthObj = {}; 
    //Store persistent data on AuthObj 
    AuthObj.ref = new Firebase("https://uniquecoders.firebaseio.com/"); 
    AuthObj.createUser = function(email,password) { 
     AuthObj.ref.createUser(
      {email: email, password: password }, 
      function(error, userData) { 
       if (error) { 
        //process error 
       } else { 
        //store data on AuthObj 
        AuthObj.userData = userData; 
       } 
      } 
     ); 
     return AuthObj.userData; 
    }; 
    //return AuthObj which holds functions and data 
    return AuthObj; 
    } 
]); 

को अपने नियंत्रक का उपयोग उन कार्यों और लगातार डेटा पुनः प्राप्त आह्वान।

app.controller("AuthCtrl", ["$scope", "Auth", 
    function($scope, Auth) { 
    //retrieve userData 
    $scope.userData = Auth.userData; 
    $scope.createUser = function() { 
      if ($scope.userData) { 
       return; 
      } else { 
       $scope.userData = 
        //invoke function in factory 
        Auth.createUser($scope.email,$scope.password); 
      }; 
    }; 
    } 
]); 

इस तरह डेटा रहता है और जब आप मार्ग बदलते हैं तब तक बने रहें।

+0

मैं इस कोड को कार्यान्वित करने के तरीके पर इतना उलझन में हूं। Bieng dum – amanuel2

+0

के लिए खेद है जब मैं एक उत्तर लिखता हूं तो मेरा लक्ष्य कुछ ऐसा है जो एक से अधिक पाठक के लिए उपयोगी होता है। तो जब कोई "AngularJS वैश्विक चर" कहता है, तो उन्हें सलाह मिलती है कि वे उपयोग कर सकते हैं। इस मामले में सलाह ** ** कारखाने प्रदाता ** में लगातार डेटा है। ** फैक्टरी प्रदाताओं के बारे में अधिक जानने के लिए ** [AngularJS सेवा डेवलपर मार्गदर्शिका] देखें (https://docs.angularjs.org/guide/services)। – georgeawg

+0

मैं जॉर्ज समझता हूं लेकिन मुझे समझ नहीं आता कि आपके कारखाने में प्रतिष्ठित डेटा कैसे रखा जाए। यहां काम करने वाला प्लंकर है जो मुझे पसंद आएगा यदि आपके पास कोई विकल्प है जो मेरे भविष्य में मेरी मदद करेगा। धन्यवाद। http://plnkr.co/edit/qB3Gkeq5ji1YQyy0kpGH?p=preview – amanuel2