Backbone.View "एल" भ्रम


97

एक दृश्य को कैसे elसंभाला जाना चाहिए ? इसे सेट करना होगा, अन्यथा घटनाओं में आग नहीं लगती ( यहां देखें )।

लेकिन क्या यह एक तत्व होना चाहिए जो पहले से ही पृष्ठ पर है? मेरे ऐप में, मैं एक (jQuery टेम्प्लेट) टेम्पलेट को एक फैंसीबॉक्स में प्रस्तुत करता हूं। elउस मामले में क्या होना चाहिए ?


11
मैंने सोचा - मैं ही इस elबात से इत्तफाक रखता हूं ।
युगल जिंदल

elकी तरह है gf। कोई भी उन्हें पूरी तरह से समझ नहीं सकता है।
माही

जवाबों:


121

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

एक उदाहरण: मेरा एक दृष्टिकोण है जो व्यक्तिगत वस्तुओं का निर्माण करता है

window.ItemView = Backbone.View.extend({
    tagName: "li", //this defaults to div if you don't declare it.
    template: _.template("<p><%= someModelKey %></p>"),
    events: {
         //this event will be attached to the model elements in
         //the el of every view inserted by AppView below
        "click": "someFunctionThatDoesSomething"
    },
    initialize: function () { 
        _.bindAll(this, "render");
        this.render();
    },
    render: function () {
        this.el.innerHTML = this.template(this.model.toJSON());
        return this;
    }
});
window.AppView = Backbone.View.extend({
    el: $("#someElementID"), //Here we actually grab a pre-existing element
    initialize: function () { 
        _.bindAll(this, "render");
        this.render(new myModel());
    },
    render: function (item) { 
        var view = new ItemView({ model: item });
        this.el.append(view.render().el);
    }
});

पहला दृश्य सिर्फ सूची आइटम बनाता है और दूसरा दृश्य वास्तव में उन्हें पृष्ठ पर रखता है। मुझे लगता है कि बैकबोन.जेएस साइट पर टूडो उदाहरण में ऐसा ही होता है । मुझे लगता है कि सम्मेलन आपको सामग्री को एल में प्रस्तुत करना है। इसलिए एल आपकी टेम्प्लेट की गई सामग्री को रखने के लिए एक लैंडिंग जगह या एक कंटेनर के रूप में कार्य करता है। बैकबोन इसके घटनाओं को इसके अंदर मॉडल डेटा से बांधता है।

जब आप कोई दृश्य बनाते आप उपयोग कर चार तरह से एल हेरफेर कर सकते हैं el:, tagName:, className:, और id:। अगर इनमें से कोई भी आईडी या वर्ग के बिना एक div को अल चूक घोषित नहीं किया जाता है। यह इस बिंदु पर पृष्ठ से संबद्ध नहीं है। आप टैगनाम का उपयोग करके टैग को कुछ और में बदल सकते हैं (जैसे tagName: "li", आपको एक योग देगा <li></li>)। आप इसी तरह की आईडी और क्लास सेट कर सकते हैं। फिर भी el आपके पेज का हिस्सा नहीं है। एल संपत्ति आपको एल ऑब्जेक्ट के बहुत ठीक अनाज हेरफेर करने की अनुमति देती है। ज्यादातर समय मैं एक का उपयोग करेंel: $("someElementInThePage")जो वास्तव में आपके द्वारा वर्तमान पृष्ठ पर आपके विचार में एल करने के लिए किए गए सभी हेरफेर को बांधता है। अन्यथा यदि आप अपने दृश्य में किए गए सभी परिश्रम को उस पृष्ठ पर दिखाना चाहते हैं, तो आपको उस पृष्ठ को अपने दृश्य में कहीं और सम्मिलित करना होगा / जोड़ना होगा (संभवतः रेंडर में)। मैं एल के रूप में कंटेनर के बारे में सोचना पसंद करता हूं जो आपके सभी दृश्य में हेरफेर करता है।


स्पष्टीकरण और उदाहरण के लिए धन्यवाद! मुझे लगता है कि यह हमेशा स्पष्ट नहीं है कि कुछ स्थितियों में एल क्या होना चाहिए और डेवलपर को इसके लिए "महसूस" करना होगा। आपके स्पष्टीकरण ने निश्चित रूप से मदद की! एक प्रश्न, हालांकि: आप अपने आइटम दृश्य में एक को परिभाषित नहीं करते हैं, लेकिन आप इसे रेंडर फ़ंक्शन में एक्सेस करते हैं। यह काम करेगा? यदि आप स्पष्ट रूप से इसे परिभाषित नहीं करते हैं तो क्या कुछ प्रकार के डिफ़ॉल्ट एल हैं?
मैनुअल मीरर

3
डिफ़ॉल्ट रूप से el एक "div" टैग है जिसमें कोई आईडी या वर्ग नहीं है। यह एक DOM ऑब्जेक्ट है जो आपके पेज DOM से बँधा नहीं है। आमतौर पर मैं इसे रेंडर फंक्शन या पेरेंट व्यू के रेंडर फंक्शन में पेज पर डालता / लगाती हूं।
LeRoy

एल के परिभाषित गुणों के कुछ विवरण के साथ मेरे उत्तर को अपडेट किया।
LeRoy

5
मुझे लगता है कि एल के साथ एक पूर्व-मौजूदा तत्व को हथियाने के साथ मेरा एकमात्र मुद्दा है: $ ("# someElementID") आपका विचार शायद इससे अधिक जानना चाहिए, जिससे इसे पुन: उपयोग करना मुश्किल हो जाए। देखें "DOM से घटिया
स्कॉट Coates

@scoarescoare के बाद से आप तात्कालिकता पर एल संपत्ति जोड़ रहे हैं दृश्य खुद को वास्तव में इससे अधिक नहीं पता होना चाहिए, यह मॉड्यूलर और किसी भी $ (एल) को स्वीकार करने में सक्षम है जिसे आप इसे सौंपना चाहते हैं। तो यह वास्तव में काफी पुन: प्रयोज्य बनाता है।
पैराग्राफर

6

अभी थोड़ा पुराना है, लेकिन मैं अन्य लोगों के लिए भी उलझन में था, और यहाँ आने वाले अन्य लोगों के लिए, यह फिडल मदद कर सकता है - http://jsfiddle.net/hRndn/2/

var MyView = Backbone.View.extend({

    events: {
        "click .btn" : "sayHello",
    },

    sayHello : function() {
        alert("Hello");
    },


    render : function() {
        this.$el.html("<input type='button' class='btn' value='Say Hello'></input>");

    }
});

$(function() {
    myView = new MyView({el:"#parent_id"});
    myView.render();
});

मैंने इस मॉडल का अनुसरण किया है और काश मैंने ऐसा नहीं किया होता। एक दृश्य को नष्ट करने और बाइंडिंग को हटाने के लिए, बैकबोन का सम्मेलन view.remove () है। यह $ el को नष्ट कर देता है और इसे DOM से हटा देता है, इसलिए जब आपको दोबारा दृश्य दिखाने की आवश्यकता होती है, तो $ el मौजूद नहीं होता है।
JJ

@ मर्क क्या अगर मैं समग्र संरचना जैसे कि मैरियनेट का उपयोग कर रहा हूं .... क्या मुझे अभी भी देखने की ज़रूरत है?
afr0

आपका फिडल कोड काम नहीं करता है, क्योंकि लिंक jsfiddle.net/hRndn
Izzy

@ माही हां आप सही हैं। मैंने शायद गलत लिंक चिपकाया है, क्षमा करें। यह एक काम करता है: jsfiddle.net/hRndn/127
Iz

1

आप अपने 'एल' को एक ऐसे तत्व का संदर्भ देना चाहते हैं जिसमें एक बच्चा तत्व होता है जिसमें कोई भी घटना होती है जो आपके विचार में परिवर्तन को ट्रिगर करती है। "बॉडी" टैग की तरह विस्तृत हो सकता है।


हम्म, कि वास्तव में यह भी स्पष्ट नहीं करता है। अधिकांश बार जो तत्व मेरे विचार में परिवर्तन को ट्रिगर कर सकते हैं वे टेम्पलेट के अंदर होते हैं, ताकि यह प्रतिपादन किया जा सके, इसलिए इससे पहले कि ये तत्व अभी तक मौजूद हैं।
मैनुअल मीरर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.