2011-10-12 19 views
18

से ईवेंट का विस्तार करें मेरे पास सभी विचारों के लिए बेस क्लास है और फिर ऐप के प्रत्येक अनुभाग में, प्रोफाइल की तरह, मेरे पास बेस क्लास भी है। इस तरह साझा टेम्पलेट्स और गुणों का उपयोग कई स्तरों पर मेरे ऐप में किया जा सकता है।स्वचालित रूप से बेस व्यू

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

मुझे एक संभावना पता है जहां मैं प्रारंभिक रूप से, बेस इवेंट क्लास लाता हूं और अपनी वर्तमान घटना को उस पर विस्तारित करता हूं, लेकिन यह थोड़ा हैकी लगता है, और मुझे प्रत्येक कोड पर इस कोड को डुप्लिकेट करना होगा। यदि आप एक बेहतर तरीका जानते हैं तो कृपया साझा करें।

धन्यवाद। रीढ़ 0.5.3 के रूप में यह केवल काम करता है:

var ParentView = Backbone.View.extend({ 

     events: { 
      'click .link': 'onLinkClick' 
     } 
}); 

var ChildView = ParentView.extend({ 

     events: function(){ 
      return _.extend({ 
       'click .something': 'onSomethingClick', 
      }, this.constructor.__super__.events); 
     } 
}); 

नोट:

+0

आप (संभावित डुप्लिकेट) इन पदों/लिंक को देखने के लिए चाहते हो सकता है: http://stackoverflow.com/questions/6257405/backbone -जेएस-व्यू-उत्तराधिकारी-यह-रिज़ॉल्यूशन-इन-पैरेंट अन्य: http://stackoverflow.com/questions/6968487/sub-class-a-backbone-view-sub-class-retain-events बाहरी साइट: http: //kalimotxocoding.blogspot.com/2011/03/playing-with-backbonejs-views.html – PhD

+0

हाय नुपल, बहुत ही वैध प्रतिक्रिया और बेहतर जांच करने के लिए धन्यवाद तो मैंने किया। आपके द्वारा पोस्ट किए गए दो स्टैकओवरफ्लो लिंक में एक अच्छा जवाब था जो नीचे दिए गए एक से अलग था। मैं उन्हें वहां जोड़ दूंगा और इस विशिष्ट प्रश्न के लिए यह एक निश्चित स्रोत बनाउंगा (अन्य प्रश्न अधिक व्यापक हैं)। इसके अतिरिक्त, kalimotxocoding.blogspot.com ब्लॉग एंट्री सिर्फ सादा भयानक है, हैकिंग backbone.js कोर की आवश्यकता है और वास्तव में कुछ भी हल नहीं करता है। मैं आपके इनपुट की सराहना करता हूं। –

उत्तर

35
var ParentView = Backbone.View.extend({ 
    'events': { 
     'click .parent-something': "onParentSomethingClick" 
    } 
}); 

var ChildView = ParentView.extend({ 
    'events': _.extend({ 
     'click .something': 'onSomethingClick', 
    }, ParentView.prototype.events) 
}); 

यह कुछ भी नहीं कर रहा है, लेकिन यह अब तक का सबसे आसान तरीका है।
मैं भी एक और रास्ते में एक सार बना लिया है मैं उपयोग कर रहे हैं: https://gist.github.com/1271041

+1

आपके द्वारा जीथब लिंक के माध्यम से प्रदान किया गया "पैरेंट" फ़ंक्शन बहुत ही शानदार है। मैं निश्चित रूप से आपके currrent _super कार्यान्वयन को अपने साथ बदल रहा हूँ। धन्यवाद!! – threejeez

+2

क्या आप अपनी ऑब्जेक्ट को _.extend() में दूसरी तरफ पास नहीं करना चाहते हैं? यानी क्लोन फिर नई घटनाओं के साथ सुपर क्लास की घटनाओं को ओवरराइट करता है? इस तरह आप बच्चे की कार्यक्षमता के साथ सुपर कार्यक्षमता को ओवरराइट कर सकते हैं, विरासत के लिए एक और परिचित दृष्टिकोण। – WildService

6

यहाँ कैसे मैं अपने बच्चे को ध्यान में रखते जनक दृश्य की घटनाओं का विस्तार है। उस संस्करण से पहले, आप ईवेंट को फ़ंक्शन के रूप में परिभाषित नहीं कर सके।

+0

धन्यवाद जॉनीओ। मैंने गैर-मानक लेकिन सर्वव्यापी '__proto__' के बारे में सुना है लेकिन जावास्क्रिप्ट में' __super__' के बारे में कभी नहीं सुना है। क्या यह बैकबोन कोर द्वारा जोड़ा गया है या यह आधुनिक ब्राउज़र में एक नई बात है? –

+1

__super__ बैकबोन कोर द्वारा जोड़ा गया है और यह विरासत वर्ग 'प्रोटोटाइप के लिए मानचित्र है। –

+0

रॉकिन '। धन्यवाद जॉनीओ। –

2

मेरा मानना ​​है कि जॉनीओ का जवाब सबसे अच्छा है। हालांकि मैं इसे करने के दो अन्य तरीकों से आया और मैं उन्हें यहां पेस्ट कर दूंगा।

यह एक दयालुता है कि कोई "स्वचालित" समाधान नहीं है जिसके लिए प्रत्येक नए दृश्य में अतिरिक्त हाथ से लिखित कोड की आवश्यकता नहीं है, लेकिन यह वही है।

ChildView = ParentView.extend({ 
    name: 'ChildView', 
    events: { 
    }, 
    constructor: function(){ 
     this.events = _.extend({}, ParentView.prototype.events, this.events); 
     console.debug(this.events); 
     ParentView.prototype.constructor.apply(this, arguments); 
    }, 
    someFunc: function(){ 
     console.debug('someFunc; this.name=%s', this.name); 
    } 
}); 

तक पॉल - backbone.js view inheritence. `this` resolution in parent

मुझे नहीं पता था कि आप अपने Backbone.view.extend में एक निर्माता विधि प्रदान कर सकता है। जानकार अच्छा लगा।

var GenericView = Backbone.View.extend({ 

    genericEvents: { 'click .close': 'close' }, 

    close: function() { console.log('closing view...'); } 

}); 

var ImplView = GenericView.extend({ 

    events: { 'click .submit': 'submit' }, 

    initialize: function(options) { 
    // done like this so that genericEvents don't overwrite any events 
    // we've defined here (in case they share the same key) 
    this.events = _.extend(this.genericEvents, this.events); 
    this.delegateEvents() 
    } 
}); 

rulfzid तक - Sub Class a Backbone.View Sub Class & retain events

मैं पहले से ही कल्पना की थी (और गिरावट आई है) इस दृष्टिकोण लेकिन यह एक अपने आधार घटना कुछ और बुला ताकि "genericEvents किसी भी घटनाओं के ऊपर लिख नहीं है" का जोड़ा मोड़ है लेखक के रूप में कहते हैं। जब तक कि वह दोनों घटनाओं के किसी प्रकार के मंगिंग के बारे में बात नहीं कर रहा है, तो आप दोनों घटनाओं के ऑब्जेक्ट के अंदर गुजर रहे हैं, मुझे यकीन नहीं है कि वह किस बारे में बात कर रहा है, मैं केवल प्रोटो या माता-पिता की घटनाओं के संदर्भ में प्रोटोटाइप का उपयोग करता हूं। लेकिन फिर, जानना अच्छा है।

+1

आप '_.extend ({}, ParentView.prototype.events, {' क्लिक करें ':' क्लोज़ '})' इनलाइन को बालव्यू की परिभाषा के अंदर इनलाइन कर सकते हैं। तब निर्माता के लिए कोई ज़रूरत नहीं है। –

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