2012-02-22 11 views
19

मैं एक दृश्य संरचना है कि ऐसा दिखाई देता है के साथ एक रीढ़ की हड्डी से ऐप्स है - ध्यान दें कि मैं संक्षिप्तता के लिए हटाया कार्यान्वयन, मॉडल, संग्रह, आदि कर दिया है:बैकबोन व्यू पदानुक्रम में मैं "बबल अप" ईवेंट कैसे कर सकता हूं?

NewsListView = Backbone.View.extend({ 

    el: $('li#newspane'), 

    // This is what I would like to be able to do 
    // events: { 'filtered': 'reset' } 

    initialize: function() { 
     _.bindAll(this); 
    }, 

    render: function() { 
    }, 

    reset: function(){ 
    } 

}); 

FilterView = Backbone.View.extend({ 

    el: $('li.filter'), 

    initialize: function() { 
    }, 

    render: function() { 
    }, 

    toggleFilter: function() { 
    } 

}); 

AllView = Backbone.View.extend({ 

    initialize: function() { 

     this.newsListView = new NewsListView(); 
     this.filterView = new FilterView(); 

    } 

}); 

अनिवार्य रूप से, जब भी FilterView के toggleFilter() समारोह कहा जाता है, मैं filtered नामक किसी ईवेंट को आग लगाना चाहता हूं या उस तरह कुछ ऐसा है जिसे NewsListView द्वारा पकड़ा जाता है, जो उसके reset() फ़ंक्शन को कॉल करता है। NewsListView ऑब्जेक्ट को FilterView पर ऑब्जेक्ट पास किए बिना, मुझे यकीन नहीं है कि इसे एक ईवेंट कैसे भेजा जाए। कोई विचार?

उत्तर

0

तो, मैं एक समाधान के साथ आया - एक ऑब्जेक्ट बनाएं जो Backbone.Events बढ़ाता है, और इसे एकाधिक दृश्यों के पैरामीटर के रूप में पास करता है। यह लगभग अभिनेताओं, या कुछ के बीच संदेश गुजरने जैसा लगता है। वैसे भी - अगर किसी और को त्वरित समाधान की आवश्यकता है, तो मैं इसे उत्तर के रूप में पोस्ट कर रहा हूं, लेकिन मैं जवाब स्वीकार नहीं कर रहा हूं। यह हैकी लगता है। मैं अभी भी एक बेहतर समाधान देखना चाहता हूं।

NewsListView = Backbone.View.extend({ 
    el: $('li#newspane'), 

    // Too bad this doesn't work, it'd be really convenient 
    // events: { 'filtered': 'reset' } 

    initialize: function() { 
     _.bindAll(this); 
     // but at least this does 
     this.options.eventProxy.bind('filtered', this.reset); 
    }, 
    render: function() {}, 
    reset: function() {} 
}); 

FilterView = Backbone.View.extend({ 
    el: $('li.filter'), 

    initialize: function() {}, 
    render: function() {}, 
    toggleFilter: function() { 
     this.options.eventProxy.trigger('filtered'); 
    } 
}); 

AllView = Backbone.View.extend({ 
    initialize: function() { 
     var eventProxy = {}; 
     _.extend(eventProxy, Backbone.Events); 
     this.newsListView = new NewsListView({eventProxy: eventProxy}); 
     this.filterView = new FilterView({eventProxy: eventProxy}); 
    } 
}); 
0

इस समस्या को छोटे backbone.js हैक का उपयोग करके हल किया जा सकता है। सीधे शब्दों में this.parent

if this.parent != null 
1

आप Backbone.Courier प्लगइन की जांच करनी चाहिए करने के लिए घटनाओं पारित करने के लिए Backbone.Events.trigger को संशोधित रूप में बुदबुदाती घटनाओं एक आदर्श उपयोग मामला है:

https://github.com/dgbeck/backbone.courier

3

आप हो सकता है jquery घटनाओं और रीढ़ की हड्डी घटनाओं की संपत्ति की पहले से ही उपलब्ध कार्यक्षमता का उपयोग कर ऐसा करने में सक्षम।

उदाहरण के लिए, अपने subview अंदर से ऐसा करने के बजाय: तो फिर किसी भी दृश्य एक माता पिता, दादा-दादी, आदि अपने बच्चे को देखने की है कि में

this.$el.trigger("yourevent", this); 

:

this.trigger("yourevent", this); 

इस बजाय करना , उस दृश्य के ईवेंट ऑब्जेक्ट पर किसी संपत्ति को परिभाषित करके उस दृश्य के $ el पर ईवेंट को सुनें:

events:{ 
    "yourevent":"yourhandler" 
} 

और उस दृश्य पर हैंडलर के रूप में अच्छी तरह से परिभाषित करते हैं:।

yourhandler:function(subview) { 
} 

तो इस तरह से, एक दृश्य क्या वंशज विचारों मौजूद बारे में जानने की जरूरत नहीं है, केवल घटना उस में रुचि रखता है के प्रकार हैं दृश्य होने वाले घटना नष्ट हो गई है, पूर्वजों के विचार पर कुछ भी बदलने की जरूरत नहीं है। यदि पूर्वज दृश्य नष्ट हो जाता है, तो बैकबोन स्वचालित रूप से हैंडलर को अलग कर देगा।

चेतावनी: मैंने वास्तव में अभी तक यह कोशिश नहीं की है, इसलिए वहां कहीं भी गॉचा हो सकता है।

+0

यह मेरे लिए काम नहीं करता है। – anyaelise

+0

आह के लिए धन्यवाद! पल। –

0

घटनाओं को ट्रिगर करने और सुनने के लिए मैंने पाया है कि सबसे आसान तरीका केवल बैकबोन ऑब्जेक्ट का उपयोग करना है।यह पहले से ही घटनाओं कार्यों यह करने में मिलाया है, तो आप सिर्फ ट्रिगर कर सकते हैं जैसे:

Backbone.on('view:eventname', function(passed_obj) { 
    console.log(passed_obj.extra_thing); 
}); 
: अपने एप्लिकेशन में किसी भी अन्य रीढ़ की हड्डी को ध्यान में रखते

Backbone.trigger('view:eventname',{extra_thing:whatever, thing2:whatever2}); 

तो, , तो आप इस घटना उदाहरण के लिए सुन सकते हैं

मुझे बिल्कुल यकीन नहीं है कि बैकबोन ऑब्जेक्ट का उपयोग आपके ईवेंट हैंडलर के रूप में नहीं कर रहा है, और इसके बजाय इसे करने के लिए एक अलग ऑब्जेक्ट बनाना है, लेकिन त्वरित और गंदे काम के लिए, उपर्युक्त काम ठीक है। HTH!

नोट: इसका एक नुकसान यह है कि प्रत्येक श्रोता इस तरह से शुरू होने वाली प्रत्येक घटना को "सुन" देगा। यह सुनिश्चित नहीं है कि उस पर बड़ा ओ क्या है, लेकिन इस सामान के साथ अपने विचारों को अधिभारित करने के लिए सावधान रहना। दोबारा: यह जल्दी और गंदा है! :)

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