2011-12-20 17 views
6

जब मेरा "चार्ट मॉडल" बदलता है तो मैं "ग्लोबल मॉडेल" को अपडेट करना चाहता हूं।Backbone.js मॉडल बदलें "आंशिक रूप से" चुप?

chartModel.bind("change", updateGlobalModel); 

updateGlobalModel(){ 
    globalModel.set(obj) 
} 

और इसके विपरीत, मैं चाहता हूं कि ग्लोबल मॉडल बदलते समय मेरा चार्ट मॉडल अपडेट करें।

globalModel.bind("change", updateChartModel); 

updateChartModel(){ 
    chartModel.set(obj) 
} 

ग्लोबल मॉडल सेट करते समय यह फीडबैक लूप में परिणाम देता है। मैं इसे {silent: true} सेट करके रोक सकता हूं।

लेकिन यहां समस्या आती है।

globalModel.bind("change", updateOtherModel); 

मैं परिवर्तन के इस मॉडल कैसे अलर्ट कर सकते हैं लेकिन नहीं पूर्व एक (प्रतिक्रिया पाश से बचने के लिए): मैं एक और मॉडल है कि परिवर्तन घटना पर निर्भर है है?

अद्यतन:
अभी के लिए, मैं प्रत्येक सेट कॉल के लिए एक विशिष्ट आईडी उत्पन्न करने के लिए फैसला किया:

set : function(attrs, options) { 
     if(!("setID" in attrs)){ 
      attrs.setID = myApp.utils.uniqueID(); //newDate.getTime(); 
     } 
     Backbone.Model.prototype.set.call(this, attrs, options); 
    }, 

इस तरह, मैं हमेशा में कहीं से भी एक "setID" विशेषता उत्पन्न कर सकते हैं मेरे आवेदन। यदि मॉडल से कुछ प्राप्त करते समय सेटआईडी अभी भी वही है, तो मुझे पता है कि फीडबैक लूप के लिए जोखिम हो सकता है।

उत्तर

0

मेरा ज्ञान सीमित है, इसलिए शायद मुझे जवाब नहीं देना चाहिए, लेकिन जब यह बनाया गया है तो मैं चार्ट मॉडल के संदर्भ को पारित करने का प्रयास करूंगा जो कि "अन्य" मॉडल को संदर्भित करता है जिसे आप अपडेट करना चाहते हैं। फिर UpdateChartModel() पर एक ईवेंट ट्रिगर करें और सुनिश्चित करें कि आपका "अन्य" मॉडल उस ईवेंट पर बाध्य है।

मेरे पास सवाल है: क्या मूक ऑब्जेक्ट सभी घटनाओं को म्यूट करता है? या सिर्फ मॉडल संबंधित हैं? यह स्पष्ट रूप से काम नहीं करेगा अगर सभी घटनाओं को म्यूट कर दिया जाता है।

+0

आपके सुझाव के लिए धन्यवाद - अगर मेरा कामकाज विफल रहता है तो मैं इसे आज़माउंगा (मैंने अपना प्रश्न अपडेट किया है।) – dani

1

बेहतर कभी नहीं से देर से ..

यह करने के लिए सबसे आसान तरीका है एक ध्वज का उपयोग कर रहा है। उदाहरण के लिए, globalModel में कुछ सेट करते समय, आप यह इंगित करने के लिए मॉडल पर एक संपत्ति भी बदल सकते हैं कि आपने कुछ बदल दिया है। फिर आप updateChartModel में इस ध्वज के मान को सत्यापित कर सकते हैं। उदाहरण के लिए:

chartModel.bind ("बदलें", updateGlobalModel);

function updateGlobalModel() { 
    if (!flag) { 
     globalModel.set(obj); 
     flag = true; 
    } 
} 

संभवतः आप अपने सेटआईडी के साथ क्या कर चुके हैं उसके समान ही हैं। एक तरफ के रूप में, अंडरस्कोर में uniqueId फ़ंक्शन बनाया गया है।

एक और चीज जो आप कर सकते हैं, जो बहुत साफ है, आपके सेट कॉल के साथ एक विकल्प पास करना है।

chartModel.set(obj, { notify : false }); 

हाँ, आप किसी भी इच्छित विकल्पों पारित कर सकते हैं, तो आप सिर्फ { silent : true } तक ही सीमित नहीं रहे हैं। अधिक के लिए this discussion on github देखें। उसके बाद, आप इस संपत्ति के अस्तित्व हैं, जहां आपने तरह परिवर्तन की घटनाओं को संभालने के लिए जाँच:

function updateGlobalModel(model, options){ 
    // explicitly check for false since it will otherwise be undefined and falsy 
    // you could reverse it.. but I find this simpler 
    if (options.notify !== false) { 
     globalModel.set(obj) 
    } 
} 

और अपने तीसरे (और अन्य मॉडल) में, आप बस इस चेक त्याग कर सकते हैं।

अंतिम विकल्प आपके डिजाइन को देखने के लिए निश्चित रूप से है। यदि ये दो मॉडल इतनी बारीकी से संबंधित हैं कि उन्हें एक-दूसरे के साथ समन्वयित रखा जाना चाहिए, तो शायद उनकी कार्यक्षमता को मर्ज करना समझ में आता है। वैकल्पिक रूप से, आप सामान्य कार्यक्षमता को विभाजित कर सकते हैं। यह सब आपकी विशेष स्थिति पर भारी निर्भर करता है।

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