2012-04-21 14 views
6

मुझे कुछ एम्बर ऑब्जेक्ट्स स्टोर करने के लिए स्थानीय स्टोरेज का उपयोग करने की आवश्यकता है। मैंने देखा कि एम्बर ऑब्जेक्ट्स में __ember1334992182483 जैसे नाम हैं। जब मैं एम्बर ऑब्जेक्ट्स पर JSON.stringify() पर कॉल करता हूं, तो इन __ember* गुणों को क्रमबद्ध नहीं किया जाता है। ऐसा क्यों है? मैं यह नहीं कह रहा हूं कि मैं उन गुणों को क्रमबद्ध करना चाहता हूं। मैं सिर्फ इस बारे में उत्सुक हूं कि वे वास्तव में क्या हैं और उन्हें कैसे कार्यान्वित किया जाता है कि वे क्रमबद्ध नहीं हैं।आप एम्बर ऑब्जेक्ट्स को क्रमबद्ध कैसे करते हैं?

मैं अपने डेटा संरचनाओं को एन्कोड करने के लिए cycle.js (https://github.com/douglascrockford/JSON-js/blob/master/cycle.js) का उपयोग कर रहा हूं जिसमें मूल डेटा संरचनाओं के पुनर्निर्माण के लिए उपयोग की जा सकने वाली स्ट्रिंग में डुप्लिकेट संदर्भ शामिल हैं। यह आप यह कर सकते हैं:

a = {a:1} 
b = {b:1} 
c = [[a, b], [b, a]] 

foo = JSON.stringify(JSON.decycle(c)) // "[[{'a':1},{'b':1}],[{'$ref':'$[0][1]'},{'$ref':'$[0][0]'}]]" 
JSON.retrocycle(JSON.parse(foo)) // reconstruct c 

एंबर वस्तुओं मैं एक ही बात कर सकते हैं के लिए, लेकिन मैं यह भी है क्योंकि वे सादे JavaScript ऑब्जेक्ट के रूप deserialised रहे Ember.Object.create() में deserialised वस्तुओं पारित करने के लिए की जरूरत है।

क्या यह एम्बर ऑब्जेक्ट्स को क्रमबद्ध/deserialise करने का सबसे अच्छा तरीका है? क्या इसके लिए एक अनुशंसित तकनीक है?

उत्तर

0

मैं एम्बर डेटा का उपयोग करता हूं और इसके लिए डेटास्टोर एडाप्टर लिखता हूं।

8

क्रमबद्धता के लिए और अक्रमांकन आप इस तर्ज पर कुछ कर सकते हैं, http://jsfiddle.net/pangratz666/NVpng/ देखें:

App.Serializable = Ember.Mixin.create({ 
    serialize: function() { 
     var propertyNames = this.get('propertyNames') || []; 
     return this.getProperties(propertyNames); 
    }, 

    deserialize: function(hash) { 
     this.setProperties(hash); 
    } 
}); 

App.Person = Ember.Object.extend(App.Serializable, { 
    propertyNames: 'firstName title fullName'.w(), 
    fullName: function() { 
     return '%@ %@'.fmt(this.get('title'), this.get('firstName')); 
    }.property('firstName', 'title') 
}); 

var hansi = App.Person.create({ 
    firstName: 'Hansi', 
    title: 'Mr.' 
}); 

// { firstName: 'hansi', title: 'Mr.', fullName: 'Mr. Hansi' } 
console.log(hansi.serialize()); 

var hubert = App.Person.create(); 
hubert.deserialize({ 
    firstName: 'Hubert', 
    title: 'Mr.' 
}); 
console.log(hubert.serialize());​ 

अद्यतन: इसके अलावा समान प्रश्न Ember model to json

+0

'__ember क्यों कर रहे हैं *' 'JSON.stringify()' के आउटपुट में गुण नहीं हैं? – hekevintran

+0

मुझे यहां अनुमान लगाना है क्योंकि मैं एक जावास्क्रिप्ट विशेषज्ञ नहीं हूं: लेकिन यदि आप 'एम्बर। ऑब्जेक्ट 'पर' (प्रोप में ओबीजे) {} 'करते हैं, तो' __ember *' सूचीबद्ध नहीं है और ' obj.hasOwnProperty' परिभाषित गुणों के लिए केवल सत्य लौटाता है, http://jsfiddle.net/pangratz666/w53DH/ देखें। – pangratz

+0

'__ember * 'गुण' के लिए ... लूप में सूचीबद्ध नहीं होते हैं। 'App.obj.hasOwnProperty ('__ ember1335029966963') करना '' सत्य' देता है। – hekevintran

0

पर एक नजर है मेरे पास है:

  • फिक्स घ और सरल कोड
  • जोड़ा वृत्तीय संदर्भ रोकथाम
  • मूल्य के प्राप्त की
  • जोड़ा उपयोग
  • एक खाली घटक के डिफ़ॉल्ट गुण के सभी हटा दिया

    //Modified by Shimon Doodkin 
    //Based on answers of: @leo, @pangratz, @kevin-pauli, @Klaus 
    //http://stackoverflow.com/questions/8669340 
    
    App.Jsonable = Em.Mixin.create({ 
        getJson : function (keysToSkip, visited) { 
         //getJson() called with no arguments, 
         // they are to pass on values during recursion. 
    
         if (!keysToSkip) 
          keysToSkip = Object.keys(Ember.Component.create()); 
    
         if (!visited) 
          visited = []; 
    
         visited.push(this); 
    
         var getIsFunction; 
    
         var jsonValue = function (attr, key, obj) { 
          if (Em.isArray(attr)) 
           return attr.map(jsonValue); 
          if (App.Jsonable.detect(attr)) 
           return attr.getJson(keysToSkip, visited); 
          return getIsFunction?obj.get(key):attr; 
         }; 
    
         var base; 
         if (!Em.isNone(this.get('jsonProperties'))) 
          base = this.getProperties(this.get('jsonProperties')); 
         else 
          base = this; 
    
         getIsFunction=Em.typeOf(base.get) === 'function'; 
    
         var json = {}; 
    
         var hasProp = Object.prototype.hasOwnProperty; 
    
         for (var key in base) { 
    
          if (!hasProp.call(base, key) || keysToSkip.indexOf(key) != -1) 
           continue; 
    
          var value = base[key]; 
    
          // there are usual circular references 
          // on keys: ownerView, controller, context === base 
    
          if (value === base || 
           value === 'toString' || 
           Em.typeOf(value) === 'function') 
           continue; 
    
          // optional, works also without this, 
          // the rule above if value === base covers the usual case 
          if (visited.indexOf(value) != -1) 
           continue; 
    
          json[key] = jsonValue(value, key, base); 
    
         } 
    
         visited.pop(); 
         return json; 
        } 
    }); 
    
    /* 
    example: 
    
    DeliveryInfoInput = Ember.Object.extend(App.Jsonable,{ 
    jsonProperties: ["title","value","name"], //Optionally specify properties for json 
    title:"", 
    value:"", 
    input:false, 
    textarea:false, 
    size:22, 
    rows:"", 
    name:"", 
    hint:"" 
    }) 
    */ 
    
संबंधित मुद्दे