2012-02-08 12 views
16

मेरे पास एक JSON ऑब्जेक्ट से बनाया गया मॉडल है।मैं मॉडल ऑब्जेक्ट पर * सभी * संपत्ति परिवर्तनों को कैसे देखूं?

// extend the json model to get all props 
App.Model = Ember.Object.extend(window.jsonModel); 

मैं कुछ भी अपडेट होने पर मॉडल को स्वचालित रूप से सहेजना चाहता हूं। क्या कोई तरीका है कि मैं पूरे मॉडल में पर्यवेक्षक जोड़ सकता हूं?

संपादित करें: // समाधान मैं वर्तमान में

जाना के लिए जोड़ने अब मुझे क्या करना:

// XXX Can't be right 
for (var prop in window.jsonModel) { 
    if (window.jsonModel.hasOwnProperty(prop)) { 
     App.model.addObserver(prop, scheduleSave); 
    } 
} 

यह एक बड़ा रूप है, मैं पर्यवेक्षकों की टन जोड़ रहा है जिसका अर्थ है है - यह तो अक्षम लगता है ।

Ember.sendEvent() पर एक फायरबग ब्रेकपॉइंट से पता चलता है कि App.model.lastName:change नामक ईवेंट हैं। मैं वहां एक अवरोध में हैक कर सकता था, लेकिन एक आधिकारिक तरीके की उम्मीद कर रहा था।

उत्तर

2

लेख से:

autosave: function(){ 
    this.save(); 
}.observes('attributes'), 


save: function(){ 
    var self = this, 
    url = this.get('isNew') ? '/todos.json' : '/todos/'+this.get('id')+'.json', 
    method = this.get('isNew') ? 'POST' : 'PUT'; 

    $.ajax(url, { 
    type: 'POST', 
    // _method is used by Rails to spoof HTTP methods not supported by all browsers 
    data: { todo: this.get('attributes'), _method: method }, 
    // Sometimes Rails returns an empty string that blows up as JSON 
    dataType: 'text', 
    success: function(data, response) { 
     data = $.trim(data); 
     if (data) { data = JSON.parse(data); } 
     if (self.get('isNew')) { self.set('id', data['todo']['id']); } 
    } 
    }); 
}, 

isNew: function(){ 
    return !this.get('id'); 
}.property('id').cacheable(), 
+0

समस्या गणना की संपत्ति 'attributes' जो स्पष्ट रूप से करने के लिए * अपने मॉडल में हर * संपत्ति (देखा बाध्य किया जाना चाहिए में है मूल लेख में) - यह वही है जो मैं नहीं चाहता हूं। –

2

मैं एक ही आवश्यकता थी, और एक उपयुक्त जवाब नहीं मिल रहा है, मैं एक कार्यान्वित किया।

इस प्रयास करें: https://gist.github.com/4279559

अनिवार्य रूप से, वस्तु आप के सभी गुण का निरीक्षण करने के Ember.Stalkable के मिश्रित होना चाहिए चाहते हैं। आप उस वस्तु के गुणों को 'आइटम' @ गुण 'के रूप में देख सकते हैं (या, यदि आप अकेले स्टैकेबल पर पर्यवेक्षकों को सेंकते हैं, तो' @properties 'अकेले काम करता है। "@ownProperties", "@initProperties" और "@prototypeProperties" भी काम करते हैं , और (गुण जो किसी उदाहरण के लिए अद्वितीय हैं और किसी भी प्रोटोटाइप पर परिभाषित नहीं हैं), (गुण जो निर्माण() आमंत्रण के हिस्से के रूप में परिभाषित किए गए हैं), और (गुण जो वर्ग परिभाषा के हिस्से के रूप में परिभाषित हैं)

अपने पर्यवेक्षकों में, यदि आप को पता है गुण क्या बदल गया है और हैंडलर, संपत्ति "modifiedProperties", एक सरणी, बदल गुण के नाम के साथ उपलब्ध हो जाएगा। लागू चाहते

8

आप isDirty संपत्ति के लिए बाध्य कर सकते हैं DS.Model के उप-वर्ग का। isDirtyझूठे से सच में परिवर्तन जब मॉडल गुणों में से एक बदलता है। यह सभी मामलों के लिए अच्छी तरह से सेवा नहीं करेगा क्योंकि यह रीसेट या प्रतिबद्ध होने तक केवल एक बार बदलता है, लेकिन आपके मामले के लिए -

मैं कुछ भी अपडेट होने पर मॉडल को स्वचालित रूप से सहेजना चाहता हूं। क्या कोई तरीका है कि मैं पूरे मॉडल में पर्यवेक्षक जोड़ सकता हूं?

यह ठीक काम कर सकता है।

+1

क्या होगा यदि आप एम्बर डेटा का उपयोग नहीं कर रहे हैं? –

0

मैं एक आभासी संपत्ति _anyProperty कि एक आश्रित कुंजी के रूप में इस्तेमाल किया जा सकता बनाया:

import Ember from 'ember'; 

Ember.Object.reopen({ 

    // Virtual property for dependencies on any property changing 
    _anyPropertyName: '_anyProperty', 
    _anyProperty: null, 

    propertyWillChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    }, 

    propertyDidChange(keyName) { 
    if (keyName !== this._anyPropertyName) { 
     this._super(this._anyPropertyName); 
    } 
    return this._super(keyName); 
    } 

}); 
संबंधित मुद्दे