2013-02-12 30 views
6

में वैश्विक चर एम्बर में वैश्विक चर को संग्रहीत करने के लिए उचित विधि क्या होगी? उदाहरण के लिए, मेरे पास एम्बर में एक उपयोगकर्ता मॉडल है, लेकिन मैं हमेशा यह जानना चाहता हूं कि उस मॉडल का कौन सा विशिष्ट उदाहरण (इसकी आईडी, नाम, ईमेल इत्यादि सहित) वर्तमान में लॉग-इन किए गए उपयोगकर्ता से मेल खाता है।एम्बर

क्या मुझे इसे किसी भी तरह एम्बर के भीतर संग्रहीत करना चाहिए? या क्या यह एक जेएस वैरिएबल को window ऑब्जेक्ट (उदा। window.currentUserId = 1;) से जोड़ना बेहतर है और इसका उपयोग करना बेहतर है?

+0

कम से कम एक 'User' वस्तु' में window.user = के रूप में इस्तेमाल करते हैं। ..'। – Reactormonk

+1

आप अपने आवेदन उदाहरण में उस राज्य को स्टोर कर सकते हैं। ऐप = Ember.Aplication.create ({currentUser: null})। जब आप तैयार हों तो उपयोगकर्ता को App.set ("उपयोगकर्ता", उपयोगकर्ता) के साथ सेट करें। – mavilein

+0

मैं अपने ऐप में कुछ केंद्रीय राज्य स्टोर करता हूं और यह ठीक काम करता है। यह थोड़ा गंध है, लेकिन यह मेरे लिए व्यवहार्य लगता है, अगर कोई इस दृष्टिकोण को अधिक उपयोग नहीं करता है। – mavilein

उत्तर

8

अस्वीकरण: नीचे दिखाए गए सभी तकनीक पिछले कुछ महीनों से एम्बरजेएस के साथ मेरा अनुभव हैं, साथ ही साथ मेरे सहयोगियों के साथ कुछ चर्चाएं भी हैं। कुछ भी गलत है, कृपया अपनी आवाज़ उठाएं। हम सभी सीखने के चरण में हैं (और ember.js दस्तावेज़ maxxx को बेकार है, तो दयालु हो;)

वर्तमान में मेरे कार्यस्थल में दो डेवलपर हैं जो Ember.js का उपयोग कर रहे हैं। हम एक निष्कर्ष पर पहुंचे कि वैश्विक ApplicationController में वैश्विक चर संग्रहीत करना एप्लिकेशन नामस्थान में संग्रहीत करने से कहीं बेहतर है। ऐसा इसलिए है क्योंकि यदि यह एप्लिकेशन नामस्थान में संग्रहीत है तो इस मान की पुनर्प्राप्ति बहुत गन्दा हो सकती है। और यह भी बंद होने में अच्छी तरह से काम करता है, और इसलिए वैश्विक नामस्थान साफ ​​(और अपेक्षाकृत हैक मुक्त) बनाते हैं। आप नहीं चाहते हैं कि आपका उपयोगकर्ता App.set को वैरिएबल दाएं गड़बड़ के साथ करे?

यह 1.0.0 प्री -4 पर आधारित है।

आप को ध्यान में रखते इस currentUserId वैश्विक चर

  1. नाम स्थान में भंडारण की है। jsFiddle demo

    (function() { 
    
        function r() { 
         return Math.round(Math.random()*999); 
        } 
    
        var MyApp = Ember.Application.create({ 
         currentUserId: null, 
         ready: function() { 
          //demo purpose. 
          this.set('currentUserId', r()); 
         }, 
         rootElement: '#demo' 
        }); 
        MyApp.ApplicationView = Ember.View.extend({ 
         templateName: 'application-view', 
    
         //Direct child view 
         innerView: Ember.View.extend({ 
          templateName: 'inner-view', 
          setValue: function() { 
           this.set('controller.namespace.currentUserId', r()); 
          } 
         }), 
    
         //Direct child view, but with a controller attached 
         innerViewWithController: Ember.View.extend({ 
          controller: Ember.Controller.create(), 
          templateName: 'inner-view-with-controller', 
          setValue: function() { 
           this.set('parentView.controller.namespace.currentUserId', r()); 
          } 
         }), 
         getValue: function() { 
          alert(this.get('controller.namespace.currentUserId')); 
         }, 
         setValue: function() { 
          this.set('controller.namespace.currentUserId', r()); 
         } 
        }); 
    })(); 
    
  2. में वैश्विक ApplicationControllerjsFiddle demo

    (function() { 
    
        function r() { 
         return Math.round(Math.random()*999); 
        } 
    
        var MyApp = Ember.Application.create({ 
         ApplicationController: Ember.Controller.extend({ 
          currentUserId: null, 
          init: function() { 
           //demo purpose 
           this.set('currentUserId', r()); 
          } 
         }), 
         rootElement: '#demo' 
        }); 
        MyApp.ApplicationView = Ember.View.extend({ 
         templateName: 'application-view', 
    
         //Direct child view 
         innerView: Ember.View.extend({ 
          templateName: 'inner-view', 
          setValue: function() { 
           this.set('controller.currentUserId', r()); 
          } 
         }), 
    
         //Direct child view, but with a controller attached 
         innerViewWithController: Ember.View.extend({ 
          controller: Ember.Controller.create(), 
          templateName: 'inner-view-with-controller', 
          setValue: function() { 
           this.set('parentView.controller.currentUserId', r()); 
          } 
         }), 
         getValue: function() { 
          alert(this.get('controller.currentUserId')); 
         }, 
         setValue: function() { 
          this.set('controller.currentUserId', r()); 
         } 
        }); 
    })(); 
    

नोट भंडारण बनाम कि:

  1. आप नाम स्थान में स्टोर करने के लिए चुना है, तो आप के माध्यम से इसे उपयोग करने की आवश्यकता होगी रूट नियंत्रक हर समय, तो यह वास्तव में भंडारण के समान ही है एक अतिरिक्त namespace कीवर्ड के साथ एप्लिकेशन नियंत्रक।

  2. आप, जड़ applicationController में संग्रहीत करना जो कुछ भी देखा गया है कि applicationView के वंशज हैं, आप आसानी से चर अपने टेम्पलेट में {{variableName}} के साथ किसी भी डॉट traversals बिना उपयोग कर सकते हैं के लिए चुना है। डिफ़ॉल्ट रूप से Ember.Js नियंत्रकों के माध्यम से चर के लिए देखो।

  3. सबसे खराब मामले में, यदि आपके आंतरिक दृश्य को अपने स्वयं के नियंत्रक की आवश्यकता है, तो रूट नियंत्रक (या नामस्थान) के माध्यम से वैश्विक चर का उपयोग करना थोड़ा अधिक दर्दनाक है क्योंकि नियंत्रक जुड़े नहीं हैं, आपको अपने विचारों को पार करने की आवश्यकता होगी जब तक आप रूट नियंत्रक नहीं देखते हैं। Ember.JS में, डिफ़ॉल्ट रूप से सभी विचारों में नियंत्रक सेट होगा, और डिफ़ॉल्ट रूप से, माता-पिता का नियंत्रक होगा। जिसका अर्थ है कि यदि आप कभी भी नियंत्रक निर्दिष्ट नहीं करते हैं, तो सभी वंशज विचार वास्तव में रूट नियंत्रक से जुड़े होते हैं। इस समस्या को दूर करने के लिए, आप परिवर्तनीय बाध्यकारी नियंत्रक में आसानी से ट्रैवर्सिंग कुरूपता को हल करने के लिए कर सकते हैं।

मैं तुम्हें वैश्विक window वस्तु में इस तरह के एक महत्वपूर्ण चर डाल करने के लिए के रूप में यह आसानी से उपयोगकर्ता द्वारा संशोधित किया जाएगा (और किसी भी संभावित मुद्दों को उठाती है) का सुझाव नहीं है। एंबर आवेदन नाम स्थान में ग्लोबल नेम स्पेस में यह लाना संभावित मुद्दा कम कर देता है, लेकिन नहीं है अगर आप इसे वैश्विक

मेरे 2 सेंट बनाने;)

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

  • कोई संबंधित समस्या नहीं^_^