2012-09-03 12 views
5

मैं वर्तमान में Backbone.Mediator का उपयोग कर रहा हूं ताकि मेरी बैकबोन + आवश्यकताजेएस परियोजना में मध्यस्थ पैटर्न के लाभ का लाभ उठा सके; हालांकि, मुझे पैटर्न के एक असाधारण व्यवहार का सामना करना पड़ा, जो इस बात से निश्चित नहीं है कि यह "डिजाइन द्वारा" है, या बल्कि, मध्यस्थ पैटर्न का मानक व्यवहार नहीं बल्कि प्लगइन में एक बग है।बैकबोन + आवश्यकताजेएस + मध्यस्थ पैटर्न परिणामस्वरूप लॉजिक शॉर्ट-सर्किटिंग और अनंत लूपिंग

एक काल्पनिक उदाहरण के रूप में:

एएमडी मॉड्यूल 1

var View1 = Backbone.View.extend({ 
    ... 
    events: { 
     'click div: switchList' 
    }, 
    switchList: function() { 
     Backbone.Mediator.pub('list:switch'); 
    } 
}); 

एएमडी मॉड्यूल 2

var View2 = Backbone.View.extend({ 
    ... 
    subscriptions: { 
     'list:switch': 'shrinkDiv' 
    }, 
    shrinkDiv: function() { 
     Backbone.Mediator.pub('div:shrink'); 
     this.shrinkAndMore(); 
    } 
}); 

return View2; 

एएमडी 3 मॉड्यूल

define(function(require) { 
    var View2 = require(**AMD Module 2**); 

    var View3 = Backbone.View.extend({ 
     ... 
     subscriptions: { 
      'div:shrink': 'createSiblingDiv' 
     }, 
     createSiblingDiv: function() { 
      this.siblingView = new View2(); 
      this.$el.after(this.siblingView.$el); 
      this.siblingView.render(); 
     } 
    }); 
}); 

मैंने सोचा कि यह इस तरह काम करेगा:, SiblingDiv, इसके निर्माण के तुरंत बाद:

     **View1**.switchList(); 
         │ 
Channel 'list:switch' │ 
         ↓ 
         **View2**.shrinkDiv(); 
         │ 
         ├─┐ 
         │ │ Channel 'div:shrink' 
         │ ↓ 
         │ **View3**.createSiblingDiv(); 
         │ │ 
         │ └──→ "SiblingDiv created and rendered" 
         │ 
         └────→ "View2 Div shrinked and more" 

हालांकि, सच्चाई के बाद से SiblingDivका एक और उदाहरण View2 जो चैनल 'स्विच सूची' की सदस्यता लेता है है , ईवेंट सिग्नल द्वारा अभी भी चैनल की सूची पर स्विचिंग द्वारा ट्रिगर किया जाएगा: स्विच '(जो **View2**.shrinkAndMore(); के निष्पादन के बाद ही समाप्त हो जाएगा)।

तो असली कोड प्रवाह इस तरह दिखता है:

     **View1**.switchList(); 
         │ 
Channel 'list:switch' │ 
         ↓ 
         **View2**.shrinkDiv(); ←──────────────────┐ 
         │           │ 
         ├─┐          │ 
         │ │ Channel 'div:shrink'     │ 
         │ ↓          │ 
         │ **View3**.createSiblingDiv();   │ 
         │ │          │ 
         │ └──→ "SiblingDiv created and rendered" ─┘ 
         │ 
         └────→ "View2 Div shrinked and more" 

एक अनंत लूप ... ओह!

मैं अपने कोड को कुछ संशोधनों के साथ मेरे रास्ते काम कर बातें कर रहा था:

var View2 = Backbone.View.extend({ 
    initialize: function() {         // new code 
     if (this.options.subscriptions) {     // new code 
      this.subscriptions = this.options.subscriptions; // new code 
     }             // new code 
    },              // new code 
    ... 
    subscriptions: { 
     'list:switch': 'shrinkDiv' 
    }, 
    shrinkDiv: function() { 
     Backbone.Mediator.pub('div:shrink'); 
     this.shrinkAndMore(); 
    } 
}); 

return View2; 

एएमडी 3 मॉड्यूल

एएमडी मॉड्यूल 2 Modded Modded

define(function(require) { 
    var View2 = require(**AMD Module 2**); 

    var View3 = Backbone.View.extend({ 
     ... 
     subscriptions: { 
      'div:shrink': 'createSiblingDiv' 
     }, 
     createSiblingDiv: function() { 
      this.siblingView = new View2({  // new code 
       subscriptions: {}     // new code 
      });         // new code 
      this.$el.after(this.siblingView.$el); 
      this.siblingView.render(); 
     } 
    }); 
}); 

लेकिन मुझे यह समझने में बहुत दिलचस्पी है कि अनंत लूपिंग व्यवहार (नया ऑब्जेक्ट के दौरान एक इवेंट सिग्नल प्रसारण भी उस सिग्नल द्वारा ट्रिगर किया जाएगा) मध्यस्थ पैटर्न पद्धति में "मानक" माना जाता है? या यह प्लगइन भाग पर बस एक बग है?

उत्तर

5

लगता है कि यह प्लगइन में एक बग है। this line पर एक नज़र डालें। यह इस चैनल में पंजीकृत सभी घटनाओं पर लूप होगा। समस्या यह है कि यह तब बंद हो जाता है जब प्रत्येक पंजीकृत घटनाओं को बुलाया जाता है और यह प्रत्येक लूप चरण में पंजीकृत घटनाओं की सरणी की लंबाई के लिए जांच करता है।तो क्या होता है:

  1. आप घटना
  2. अपने पंजीकृत घटना
  3. कहा जाता है एक नया उदाहरण बनाई गई है आग और इस वृद्धि चैनल
  4. को अपने आप पंजीकृत सरणी की लंबाई एक
  5. द्वारा
  6. तो बजाय पाश समाप्त होने के यह अभी बनाया देखने के श्रोता फोन करेगा
  7. 3.
के लिए वापस जाओ

लाइन के लिए बदल रहा है:

for (var i = 0, l = channels[channel].length; i < l; i++) { 

इस कारण आप शुरुआत में सरणी की लंबाई मिल ठीक करना चाहिए। नया तत्व जोड़ना एक infinit पाश में खत्म नहीं होगा।

+0

अच्छा पकड़, इसकी प्रकृति से एक बग की तरह दिखता है ... इसे खोदने के लिए धन्यवाद और महान उत्तर = डी – Kay

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