मैं वर्तमान में 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();
}
});
});
लेकिन मुझे यह समझने में बहुत दिलचस्पी है कि अनंत लूपिंग व्यवहार (नया ऑब्जेक्ट के दौरान एक इवेंट सिग्नल प्रसारण भी उस सिग्नल द्वारा ट्रिगर किया जाएगा) मध्यस्थ पैटर्न पद्धति में "मानक" माना जाता है? या यह प्लगइन भाग पर बस एक बग है?
अच्छा पकड़, इसकी प्रकृति से एक बग की तरह दिखता है ... इसे खोदने के लिए धन्यवाद और महान उत्तर = डी – Kay