กระดูกสันหลังดู "el" สับสน


97

มุมมองควรelได้รับการจัดการอย่างไร? จะต้องมีการตั้งค่ามิฉะนั้นเหตุการณ์จะไม่เริ่มทำงาน (ดูที่นี่ )

แต่มันควรจะเป็นองค์ประกอบที่มีอยู่แล้วในหน้าหรือไม่? ในแอปของฉันฉันสร้างเทมเพลต (jQuery Templates) ลงใน Fancybox elในกรณีนั้นควรเป็นอย่างไร?


11
ฉันคิดว่า - ฉันเป็นคนเดียวที่เล่นซอกับelสิ่งนั้น
Yugal Jindle

elเป็นเหมือนgf. ไม่มีใครสามารถเข้าใจพวกเขาได้ทั้งหมด
Mahi

คำตอบ:


121

มุมมอง el คือที่ที่การผูกเหตุการณ์ทั้งหมดเกิดขึ้น คุณไม่จำเป็นต้องใช้มัน แต่ถ้าคุณต้องการกระดูกสันหลังเพื่อเริ่มการทำงานของเหตุการณ์คุณจำเป็นต้องทำการเรนเดอร์ของคุณกับเอล มุมมอง 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);
    }
});

มุมมองแรกเพียงแค่สร้างรายการและมุมมองที่สองจะวางรายการเหล่านั้นบนหน้าจริงๆ ฉันคิดว่านี่ค่อนข้างคล้ายกับสิ่งที่เกิดขึ้นในตัวอย่างสิ่งที่ต้องทำบนไซต์ backbone.js ฉันคิดว่าการประชุมคือการแสดงเนื้อหาของคุณเป็นเอล ดังนั้นเอลจึงทำหน้าที่เป็นจุดขึ้นลงหรือภาชนะสำหรับวางเนื้อหาที่เป็นเทมเพลตของคุณ จากนั้นแบ็กโบนจะเชื่อมโยงเหตุการณ์กับข้อมูลโมเดลที่อยู่ภายใน

เมื่อคุณสร้างมุมมองที่คุณสามารถจัดการกับเอลในสี่วิธีใช้el:, tagName:, และclassName: id:หากไม่มีสิ่งเหล่านี้ถูกประกาศว่าค่าเริ่มต้นเป็น div ที่ไม่มี id หรือ class นอกจากนี้ยังไม่เกี่ยวข้องกับเพจในตอนนี้ คุณสามารถเปลี่ยนแท็กเป็นอย่างอื่นได้โดยใช้ tagName (เช่นtagName: "li"จะให้เอลของคุณ<li></li>) คุณสามารถตั้งค่า id และคลาสของ el ได้เช่นเดียวกัน ยังคง el ไม่ได้เป็นส่วนหนึ่งของเพจของคุณ คุณสมบัติ el ช่วยให้คุณสามารถจัดการกับเกรนของวัตถุ el ได้อย่างละเอียดมาก ส่วนใหญ่ฉันใช้ไฟล์el: $("someElementInThePage")ซึ่งจะผูกการจัดการทั้งหมดที่คุณทำกับ el ในมุมมองของคุณกับหน้าปัจจุบัน มิฉะนั้นหากคุณต้องการเห็นการทำงานหนักทั้งหมดที่คุณทำในมุมมองของคุณปรากฏบนหน้าคุณจะต้องแทรก / ต่อท้ายหน้านั้นในที่อื่นในมุมมองของคุณ (อาจเป็นในการแสดงผล) ฉันชอบคิดว่าเอลเป็นภาชนะที่ทุกมุมมองของคุณปรับแต่ง


ขอบคุณสำหรับคำชี้แจงและตัวอย่าง! ฉันคิดว่ามันไม่ชัดเจนเสมอไปว่าเอลควรจะเป็นอย่างไรในบางสถานการณ์และนักพัฒนาต้องได้รับ "ความรู้สึก" สำหรับมัน คำอธิบายของคุณช่วยได้อย่างแน่นอน! คำถามหนึ่งข้อ: คุณไม่ได้กำหนด el ใน ItemView ของคุณ แต่คุณเข้าถึงได้ในฟังก์ชันการแสดงผล จะได้ผลหรือไม่ มีเอลเริ่มต้นบางประเภทหรือไม่หากคุณไม่ได้กำหนดอย่างชัดเจน?
Manuel Meurer

3
โดยค่าเริ่มต้น el คือแท็ก "div" ที่ไม่มีรหัสหรือคลาส เป็นวัตถุ DOM ที่ไม่ผูกมัดกับ DOM ของเพจของคุณ โดยปกติฉันจะแทรก / ต่อท้ายหน้าในฟังก์ชัน render หรือฟังก์ชัน render ของมุมมองหลัก
LeRoy

อัปเดตคำตอบของฉันพร้อมคำอธิบายคุณสมบัติบางอย่างที่กำหนด el
LeRoy

5
ฉันเดาว่าปัญหาเดียวของฉันในการดึงองค์ประกอบที่มีอยู่แล้วด้วย el: $ ("# someElementID") คือมุมมองของคุณอาจรู้มากกว่าที่ควรทำให้ยากที่จะนำมาใช้ซ้ำ ดู "Decouple view from DOM ... " coenraets.org/blog/2012/01/…
Scott Coates

@scoarescoare เนื่องจากคุณกำลังเพิ่มคุณสมบัติ el ในการสร้างอินสแตนซ์มุมมองนั้นไม่ได้รู้มากกว่าที่ควรจริงมันยังคงเป็นแบบแยกส่วนและสามารถรับ $ (el) ที่คุณต้องการส่ง นี่จึงทำให้สามารถนำกลับมาใช้ใหม่ได้จริงๆ
Metagrapher

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
Izzy

1

คุณต้องการให้ "el" อ้างอิงองค์ประกอบที่มีองค์ประกอบลูกที่มีเหตุการณ์ใด ๆ ที่ทำให้เกิดการเปลี่ยนแปลงในมุมมองของคุณ อาจมีความกว้างเท่ากับแท็ก "body"


อืมมันก็ไม่ชัดเจนเหมือนกัน บ่อยครั้งที่องค์ประกอบที่ทำให้เกิดการเปลี่ยนแปลงในมุมมองของฉันจะอยู่ภายในเทมเพลตที่มุมมองแสดงผลดังนั้นก่อนที่จะแสดงผลองค์ประกอบเหล่านี้จึงยังไม่มี
Manuel Meurer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.