ฉันมีการตั้งค่ามุมมองที่ซ้อนกันซึ่งสามารถเข้าถึงแอปพลิเคชันของฉันได้ค่อนข้างลึก มีหลายวิธีที่ฉันสามารถคิดเริ่มต้นแสดงผลและต่อท้ายมุมมองย่อยได้ แต่ฉันสงสัยว่าแนวทางปฏิบัติทั่วไปคืออะไร
นี่คือสองสามข้อที่ฉันคิดไว้:
initialize : function () {
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template());
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
ข้อดี:คุณไม่ต้องกังวลเกี่ยวกับการรักษาคำสั่ง DOM ที่ถูกต้องด้วยการต่อท้าย มุมมองจะเริ่มต้นในช่วงต้นดังนั้นจึงไม่มีสิ่งที่ต้องทำทั้งหมดพร้อมกันในฟังก์ชันการแสดงผล
จุดด้อย:คุณถูกบังคับให้มอบหมายงานใหม่ () ซึ่งอาจมีค่าใช้จ่ายสูง? ฟังก์ชันการแสดงผลของมุมมองพาเรนต์ยุ่งเหยิงกับการแสดงผลมุมมองย่อยทั้งหมดที่ต้องเกิดขึ้น? คุณไม่มีความสามารถในการตั้งค่าtagName
องค์ประกอบดังนั้นเทมเพลตจำเป็นต้องดูแล tagNames ที่ถูกต้อง
อีกวิธีหนึ่ง:
initialize : function () {
},
render : function () {
this.$el.empty();
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
this.$el.append(this.subView1.render().el, this.subView2.render().el);
}
ข้อดี:คุณไม่จำเป็นต้องมอบหมายกิจกรรมใหม่ คุณไม่จำเป็นต้องมีเทมเพลตที่มีเพียงตัวยึดตำแหน่งว่างและ tagName ของคุณจะถูกกำหนดโดยมุมมอง
จุดด้อย:ตอนนี้คุณต้องแน่ใจว่าได้ต่อท้ายสิ่งต่างๆตามลำดับที่ถูกต้อง การเรนเดอร์ของมุมมองพาเรนต์ยังคงเกะกะโดยการแสดงผลมุมมองย่อย
ด้วยonRender
เหตุการณ์:
initialize : function () {
this.on('render', this.onRender);
this.subView1 = new Subview({options});
this.subView2 = new Subview({options});
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
ข้อดี:ตอนนี้ตรรกะมุมมองย่อยถูกแยกออกจากrender()
วิธีการของมุมมอง
ด้วยonRender
เหตุการณ์:
initialize : function () {
this.on('render', this.onRender);
},
render : function () {
this.$el.html(this.template);
//other stuff
return this.trigger('render');
},
onRender : function () {
this.subView1 = new Subview();
this.subView2 = new Subview();
this.subView1.setElement('.some-el').render();
this.subView2.setElement('.some-el').render();
}
ฉันได้ผสมและจับคู่แนวทางปฏิบัติที่แตกต่างกันมากมายในตัวอย่างเหล่านี้ทั้งหมด (ขออภัยด้วย) แต่สิ่งใดที่คุณจะเก็บไว้หรือเพิ่ม? แล้วคุณจะไม่ทำอะไร?
สรุปแนวทางปฏิบัติ:
- สร้างอินสแตนซ์มุมมองย่อยใน
initialize
หรือในrender
? - ใช้ตรรกะการแสดงผลมุมมองย่อยทั้งหมดใน
render
หรือในonRender
? - ใช้
setElement
หรือappend/appendTo
?