2014-11-23 10 views
8

मैं कोणीय/आयनिक के लिए नया हूं। मेरे ऐप के लॉन्च पर, कोणीय/आयनिक का उपयोग करने से पहले, मैं जांच कर रहा था कि क्या हम फोनगैप या ब्राउजर के तहत थे और इस जानकारी का उपयोग ग्लोबल बूलियन वैरिएबल में करते हैं और फिर यह जांचते हैं कि ऐप ऑनलाइन या ऑफ़लाइन था या नहीं वैश्विक चर भी, इस तरह:angularjs आयनिक और वैश्विक चर: वैश्विक स्तर पर एक चर उपलब्ध कराने के लिए सर्वोत्तम अभ्यास

var isPhoneGap; 
var connectionStatus; 
isPhoneGap = checkIfPhoneGap(); 

//later in the code : 

connectionStatus = checkIfOnline(); 

function checkIfPhoneGap() { 
    var app = document.URL.indexOf('http://') === -1 && document.URL.indexOf('https://') === -1; // && document.URL.indexOf('file://'); 
    if (app) { 
     return true; 
    } else { 
     return false; 
    } 
} 
function checkIfOnline() { 
    if (isPhoneGap) { 
     if (checkConnection() == "none") { 
      connectionStatus = 'offline'; 
     } else { 
      connectionStatus = 'online'; 
     } 
     function checkConnection() { 
      var networkState = navigator.network.connection.type; 
      var states = {}; 
      states[Connection.UNKNOWN] = 'Unknown connection'; 
      states[Connection.ETHERNET] = 'Ethernet connection'; 
      states[Connection.WIFI]  = 'WiFi connection'; 
      states[Connection.CELL_2G] = 'Cell 2G connection'; 
      states[Connection.CELL_3G] = 'Cell 3G connection'; 
      states[Connection.CELL_4G] = 'Cell 4G connection'; 
      states[Connection.NONE]  = 'No network connection'; 
      //console.log('Connection : ' + Connection); 
      //console.log('Connection type: ' + states[networkState]); 
      return networkState; 
     } 
    } else { 
     connectionStatus = navigator.onLine ? 'online' : 'offline'; 
    } 
    return connectionStatus; 
} 

अब मैं कोणीय/आयोनिक साथ भी ऐसा ही चाहते, मैं समझता हूँ कि मैं एक "सेवा" का उपयोग करना होगा होगा। लेकिन क्या यह जानकारी सभी कोड के माध्यम से उपलब्ध कराने का सबसे अच्छा तरीका है?

मैं निम्नलिखित कर रहा हूं, लेकिन क्या यह "सर्वोत्तम अभ्यास" है?

<script src="js/app.js"></script> 
<script src="js/controllers.js"></script> 
<script src="js/services.js"></script> 

services.js में:

angular.module('SnowBoard.services', []) 

.factory('isPhoneGap', function() { 

    var appp = document.URL.indexOf('http://') === -1 && document.URL.indexOf('https://') === -1; // && document.URL.indexOf('file://'); 
    if (appp) { 
     return true; 
    } else { 
     return false; 
    } 

}) 

; 

app.js में:

index.html में

angular.module('SnowBoard', ['ionic', 'SnowBoard.controllers', 'SnowBoard.services']) 

.run(["isPhoneGap","$ionicPlatform", function(isPhoneGap, $ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if(window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    } 
    if(window.StatusBar) { 
     // org.apache.cordova.statusbar required 
     StatusBar.styleDefault(); 
    } 
    }); 

    //CHECK IF ONLINE 
    connectionStatus = checkIfOnline(isPhoneGap); 

    //DEBUG 
    //var debugOptionUseLocalDB=0; 
    //updateProDB(connectionStatus, debugOptionUseLocalDB); 
}]) 
.config(function($stateProvider, $urlRouterProvider) { 
//...all state configurations 
}) 
.config(function($stateProvider, $urlRouterProvider) { 
//... 
}); 

यह अब के लिए काम करता है, लेकिन मैं बूलियन की जरूरत isPhoneGap हर जगह उपलब्ध होने के लिए मुझे इसकी आवश्यकता है (लगभग मेरे ऐप में लगभग हर जगह)।

क्या आप ऐसा करने के लिए सबसे अच्छा अभ्यास कर सकते हैं?

धन्यवाद

उत्तर

10

आपको $rootScope का उपयोग करके चर सेट नहीं करना चाहिए, और जितना संभव हो सके $scope का उपयोग करने से बचने का प्रयास करें। LocalStorage का उपयोग करना ठीक है, लेकिन यह डेटा जारी रहेगा।मैं SessionStorage का उपयोग कर चर को स्टोर और पुनर्प्राप्त करने के लिए एक कारखाने की स्थापना करने की सिफारिश करता हूं। SessionStorage आपके द्वारा खोले गए टैब से जुड़ा हुआ है, इसलिए बंद होने पर डेटा चला गया है।

यह मेरा सत्र भंडारण सेवाओं में से एक है। यदि स्थानीय संग्रहण उपलब्ध नहीं है तो मैं $cookieStorage फेंक देता हूं। इसके अलावा, स्थानीय स्टोरेज केवल तारों को स्टोर कर सकता है। यही कारण है कि आप मुझे आवश्यकतानुसार जेएसओएन से वस्तुओं और सरणी को परिवर्तित कर देखेंगे। sessionService इंजेक्शन लगाने के बाद, मैं केवल जरूरत sessionService.store(name, data) फोन लगातार डेटा अर्थात userName स्टोर करने के लिए एक सत्र चर या sessionService.persist(name, data) स्टोर करने के लिए करता है, तो "मुझे याद रखें" चेक किया गया है। :

.service('sessionService', ['$cookieStore', function ($cookieStore) { 
    var localStoreAvailable = typeof (Storage) !== "undefined"; 
    this.store = function (name, details) { 
     if (localStoreAvailable) { 
      if (angular.isUndefined(details)) { 
       details = null; 
      } else if (angular.isObject(details) || angular.isArray(details) || angular.isNumber(+details || details)) { 
       details = angular.toJson(details); 
      }; 
      sessionStorage.setItem(name, details); 
     } else { 
      $cookieStore.put(name, details); 
     }; 
    }; 

    this.persist = function(name, details) { 
     if (localStoreAvailable) { 
      if (angular.isUndefined(details)) { 
       details = null; 
      } else if (angular.isObject(details) || angular.isArray(details) || angular.isNumber(+details || details)) { 
       details = angular.toJson(details); 
      }; 
      localStorage.setItem(name, details); 
     } else { 
      $cookieStore.put(name, details); 
     } 
    }; 

    this.get = function (name) { 
     if (localStoreAvailable) { 
      return getItem(name); 
     } else { 
      return $cookieStore.get(name); 
     } 
    }; 

    this.destroy = function (name) { 
     if (localStoreAvailable) { 
      localStorage.removeItem(name); 
      sessionStorage.removeItem(name); 
     } else { 
      $cookieStore.remove(name); 
     }; 
    }; 

    var getItem = function (name) { 
     var data; 
     var localData = localStorage.getItem(name); 
     var sessionData = sessionStorage.getItem(name); 

     if (sessionData) { 
      data = sessionData; 
     } else if (localData) { 
      data = localData; 
     } else { 
      return null; 
     } 

     if (data === '[object Object]') { return null; }; 
     if (!data.length || data === 'null') { return null; }; 

     if (data.charAt(0) === "{" || data.charAt(0) === "[" || angular.isNumber(data)) { 
      return angular.fromJson(data); 
     }; 

     return data; 
    }; 

    return this; 
}]) 

$ कुकीस्टोर ngCookies का हिस्सा है। सुनिश्चित करें कि आपके पास कोणीय-कुकीज़.जेएस शामिल हैं और ngCookies लोड करें क्योंकि आप कोई मॉड्यूल करेंगे। Angular ngCookies

+1

हाय, आपके उत्तर के लिए धन्यवाद। लेकिन क्या कोणीय के साथ किसी प्रकार का "ग्लोबल वैरिएबल" उपयोग करने का कोई तरीका नहीं है? मेरा मतलब ये चर है, मुझे कोड में हर जगह उनकी आवश्यकता है (और कई टैब में भी)। – Louis

+1

हां, वहाँ है। नहीं, आपको इसका इस्तेमाल नहीं करना चाहिए। जावास्क्रिप्ट ग्लोबल्स को अच्छी तरह से उधार नहीं देता है। सबसे अच्छा अभ्यास नियंत्रकों के बीच डेटा साझा करने के लिए कारखाने या सेवा का उपयोग करना है। हैक $ rootScope का उपयोग करना है। – Owen

+0

मैंने अभी अपना कोड अपडेट किया है, क्योंकि अगर और कोई त्रुटि हुई है। और अब मेरे पास कोणीय से एक और त्रुटि है: 'असहज त्रुटि: [$ इंजेक्टर: unpr] अज्ञात प्रदाता: $ cookieStoreProvider <- $ कुकीस्टोर <- sessionService <- updateProDB' क्या आप इसे ठीक करने में मेरी सहायता कर सकते हैं? – Louis

0

वहाँ जाने वाले डेटा को डिवाइस प्रकार के संबंध में की जरूरत है वापस पाने में सहायता ionic.Platform में उपलब्ध तरीके हैं।

http://ionicframework.com/docs/api/utility/ionic.Platform/

आप वैकल्पिक रूप से ngCordova, जो कॉर्डोबा प्लगइन के सापेक्ष उपयोगी रैपर, डिवाइस प्लगइन सहित का एक समूह है जोड़ने पर दिखाई दे सकता है।

http://ngcordova.com/docs/#Device

+1

हाय, जवाब देने के लिए धन्यवाद, मेरे सवाल नहीं कैसे डिवाइस का पता लगाने के पर वास्तव में, था क्योंकि मैं अपने कार्य के साथ बहुत खुश हूँ। लेकिन यह बूलियन वैरिएबल को कोड पर हर जगह उपलब्ध कराने के तरीके पर और अधिक था, जो वैश्विक चर की तरह थोड़ा सा था। मैंने अपना प्रश्न संपादित कर लिया है। – Louis

3

सबसे पहले, मैं बहुत दोनों आयोनिक और कोणीय के लिए नया हूँ, लेकिन मैं कोणीय अपने वेब अनुप्रयोग के साथ एक ही समस्या थी और मैं निम्नलिखित हो यह

  1. काम करने के लिए किया है $rootScope पर वैरिएबल असाइन करें, इस तरह यह सभी नियंत्रकों को

  2. $scope पर चर निर्दिष्ट करें, जो वर्तमान संदर्भ द्वारा दिखाई देता है। पूर्व: नियंत्रक और एचटीएमएल पेज उस नियंत्रक का उपयोग करते हैं

  3. localStorageService, क्योंकि उपयोगकर्ता पृष्ठ को रीफ्रेश करने के बाद भी मान रखेगा।

फिर कृपया ध्यान दें, मैंने अपने कोणीय वेब ऐप में यही किया है और शायद यह सर्वोत्तम प्रथा नहीं है, लेकिन मुझे उम्मीद है कि आपको यह विचार मिल जाएगा।

+0

$ रूटस्कोप मेरे साथ ठीक काम कर रहा है (सेवा यूआरआई पता संग्रहित)। लेकिन $ rootScope और window.localStorage.setItem के बीच क्या अंतर है ?? – Nabeel

+0

अंतर यह है कि, ऐप बंद होने पर भी स्थानीय स्टोरेज डेटा तब भी जारी रहेगा जब स्पष्ट रूप से साफ़ किया जाता है। लेकिन, पृष्ठ रीफ्रेश/बंद होने पर रूटस्कोप मान खो जाता है। – ChandrasekarG

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