Tampilan Backbone dan DOM
() translation by (you can also view the original English article)



Ikhtisar
Tampilan backbone memberikan konvensi dan abstraksi yang berguna untuk pengguna interface. Namun, untuk menyertakan fungsionalitas UI di aplikasi anda , Backbone tidak dirancang untuk mendukungnya, anda harus mempertimbangkan cara mengintegrasikan fungsi khusus atau pihak ketiga secara efektif ke aplikasi Backbone anda. Akibatnya, pengembang harus menavigasi tantangan dan menghindari konflik yang rumit antara perpustakaan eksternal dan Backbone.
Perkenalan Backbone.js
Backbone adalah cara yang fantastis untuk mengatur kode sisi klien anda. Dengan abstraksi seperti model, tampilan, dan koleksi, Backbone membantu pengembang serius menulis aplikasi terorganisir dan terukur dengan baik.
Meskipun ada banyak alternatif untuk Backbone, termasuk Angular and Ember, Backbone memberi pengembang kebebasan yang luar biasa untuk menulis dan mengatur kode mereka dengan cara alami dan nyaman tanpa terlalu memikirkan tentang seperti bagaimana tampilan Model Obyek Dokumen (DOM) .
Skinny di Backbone Views
Tampilan adalah salah satu komponen paling kuat dan fleksibel di Backbone. Menurut penulis Backbone:
Tampilan backbone adalah konvensi yang hampir lebih dari sekadar kode - mereka tidak menentukan apa pun tentang HTML anda atau CSS untuk anda, dan dapat digunakan dengan pustaka template JavaScript.
Mereka terbiasa memanipulasi apa yang pengguna lihat di browser mereka, dan mereka memfasilitasi komunikasi dengan model. Akibatnya, dalam paradigma Model-View-Controller, ada gunanya memikirkan Backbone Views sebagai view dan controller.
Hal ini memiliki implikasi serius saat mengembangkan aplikasi dengan interaksi pengguna yang signifikan. Sebenarnya, ada banyak situasi di mana anda mungkin ingin menggunakan beberapa perpustakaan lain untuk memanipulasi DOM. Visualisasi data dan game berbasis web adalah dua contoh di mana anda mungkin memilih untuk memiliki perpustakaan lain yang menangani sebagian tampilan pengguna anda. Akibatnya, anda mungkin mempertimbangkan untuk menggunakan jQuery, d3.js, crossfilter, atau three.js untuk beberapa kebutuhan manipulasi DOM anda.
Untungnya, ada cara untuk membuat Backbone berfungsi dengan baik dengan manipulator DOM lainnya.
Memanipulasi Model Objek Dokumen di Backbone
Sebelum kita masuk ke dalamnya, mari kita tinjau manipulasi DOM di Backbone. Mari kita mulai dengan objek tampilan dasar.
1 |
var SomeView = Backbone.View.extend({ |
2 |
// Some definition stuff here
|
3 |
});
|
4 |
|
5 |
var aView = new SomeView(); |
Baik Sekarang, mari kita sampaikan pandangan bagaimana membuat dirinya sendiri dengan mendefinisikan metode .render()
. metode
1 |
var SomeView = Backbone.View.extend({ |
2 |
// define how to render something
|
3 |
render: function() { |
4 |
// get some HTML
|
5 |
var htmlContent = "<p>This some HTML that will be inserted into the DOM</p>"; |
6 |
|
7 |
// insert the html
|
8 |
this.$el.html(htmlContent); |
9 |
|
10 |
// return an instance of the object for chaining
|
11 |
return this; |
12 |
}
|
13 |
});
|
Ada beberapa hal yang terjadi di sini, jadi mari kita ikuti langkahnya.
Mendefinisikan .render() metode
Pertama, kita definisikan metode .render()
yang mengenkapsulasi logika yang diperlukan untuk membuat HTML. Perhatikan bahwa Backbone hadir dengan metode .render()
di luar jangkauan. Namun, itu tidak melakukan apapun. Ia dirancang untuk ditimpa dengan logika kustom!
Mendapatkan Konten HTML
Contoh di atas mengasumsikan bahwa anda mendapatkan HTML di suatu tempat. Anda bisa menggunakan garis bawah _.template ()
. Sebagai alternatif, kita bisa menggunakan perpustakaan template lainnya, seperti Handlebars (favorit pribadi saya). Yang benar-benar penting adalah, entah bagaimana, kita mendapatkan beberapa konten HTML.
Apa itu el
?
Kita butuh tempat untuk meletakkan konten HTML; itulah gunanya el
. Seperti .render ()
, el
adalah atribut yang dilengkapi dengan Backbone Views di luar kotak. Ia merujuk pada elemen HTML (dan semua anak-anaknya) yang terdapat dalam tampilan ini. Dalam contoh di atas, kami tidak menentukannya el
. Secara default, el
adalah div
Namun, kita bisa dengan mudah mengatur elemen induk seperti:
1 |
var SomeView = Backbone.View.extend({ |
2 |
el: "article", ... |
3 |
});
|
4 |
|
5 |
var aView = new SomeView(); |
6 |
|
7 |
console.log(aView.el); // an empty "article" HTML element |
Ada juga $el
, yang hanya el
dibungkus jQuery. Kita lihat nanti bahwa $el
memainkan peran yang kuat dalam menguasai Backbone views.
Mengembalikan this
...
Akhirnya, kita mengembalikan referensi ke objek itu sendiri untuk memungkinkan melakukan chaining. Meski tidak benar-benar dibutuhkan, mengembalikan this
adalah konvensi. Tanpa return this
, kita perlu beberapa cara untuk mengakses konten HTML elemen. Kode berikut menggambarkan solusi alternatif.
1 |
/**
|
2 |
* If render() returns nothing, we are really
|
3 |
* accessing the `el` property of undefined, which does not
|
4 |
* exist!
|
5 |
*/
|
6 |
aView.render().el; // Should throw an error |
7 |
|
8 |
// Try accessing the HTML
|
9 |
console.log(aView.el); // Should be empty (but defined!) |
10 |
|
11 |
// add HTML to the DOM of 'aView'
|
12 |
aView.render(); |
13 |
|
14 |
// Try accessing the HTML again
|
15 |
console.log(aView.el) // Should contain the HTML |
Uhh, tidak ada yang ada di layar!
Poin bagus. Meskipun k ita panggil .render ()
, tidak ada sesuatu di layar-apa yang bisa diberikan?
Hal ini terjadi karena kita belum berinteraksi dengan DOM. Yang kami lakukan hanyalah menghasilkan beberapa HTML dan mewakilinya dalam objek JavaScript yang disebut aView
. Karena sekarang kita memiliki akses ke HTML yang dihasilkan, yang harus kita lakukan adalah menambahkan atau memasukkan HTML di DOM aplikasi web anda.
Untuk memindahkan semuanya, kami juga akan menyiapkan aplikasi mini sehingga saat laman dimuat, tampilan akan muncul. Berikut adalah tampilan HTML dan JavaScript anda.
Setup HTML dasar
1 |
<html>
|
2 |
<head>
|
3 |
<meta charset="utf-8"> |
4 |
<title>My Awesome Backbone App</title> |
5 |
<!-- Include your CSS Here -->
|
6 |
<link rel="stylesheet" type="text/css" href="/css/styles.css" /> |
7 |
|
8 |
<!-- Include JS dependencies -->
|
9 |
<!-- Backbone depends on underscore and, in this example,
|
10 |
depends on jQuery. Please note the order of the
|
11 |
dependencies -->
|
12 |
<script src="/js/lib/jquery.js"></script> |
13 |
<script src="/js/lib/underscore.js"></script> |
14 |
<script src="/js/lib/backbone.js"></script> |
15 |
</head>
|
16 |
<body>
|
17 |
<div class="app"></div> |
18 |
<!-- Include your custom Backbone code in the below script -->
|
19 |
<script src="/js/app.js"></script> |
20 |
</body>
|
21 |
</html>
|
Inilah yang Terjadi di App.js
1 |
// Create a view
|
2 |
var SomeView = Backbone.View.extend({ |
3 |
initialize: function() {}, |
4 |
render: function() { |
5 |
var someHTML = "<p>This is some HTML</p>"; |
6 |
this.$el.html(someHTML); |
7 |
return this; |
8 |
}
|
9 |
});
|
10 |
|
11 |
// Create a router
|
12 |
var Router = Backbone.Router.extend({ |
13 |
// define your routes
|
14 |
routes: { "": "home" }, |
15 |
home: function() { |
16 |
var aView = new SomeView(); |
17 |
$('.app').html(aView.render().el); |
18 |
}
|
19 |
});
|
20 |
|
21 |
// Instantiate your router
|
22 |
new Router(); |
23 |
|
24 |
// Start tracking history
|
25 |
Backbone.history.start(); |
Pergi ke server / browser lokal Anda, muat halaman, dan aplikasi anda harus berjalan!
Menggunakan Backbone dan jQuery secara bersamaan
Fleksibilitas Backbone memungkinkan penggunaan perpustakaan pihak ketiga untuk memanipulasi DOM. Salah satu skenario adalah ketika anda ingin menggunakan jQuery dan Backbone secara bersamaan untuk memanipulasi view Anda. Berikut adalah contoh yang diperbarui.
1 |
var SomeView = Backbone.View.extend({ |
2 |
|
3 |
// Manipulate DOM indirectly by creating HTML content in a
|
4 |
// Backbone View
|
5 |
render: function() { |
6 |
var someHTML = "<p>Some HTML</p><p class='empty'><p>"; |
7 |
this.$el.html(someHTML); |
8 |
return this; |
9 |
},
|
10 |
|
11 |
// Manipulate DOM directly from within the Backbone View
|
12 |
renderWithJQuery: function() { |
13 |
var otherHTML = "<p>Other HTML</p>"; |
14 |
$('.app').append(otherHTML); |
15 |
|
16 |
// may not make sense to return 'this'
|
17 |
},
|
18 |
|
19 |
// another render method, to keep things interesting
|
20 |
specialRender: function() { |
21 |
this.$('.empty').append("<span>No longer empty!</span>"); |
22 |
return this; |
23 |
}
|
24 |
});
|
25 |
|
26 |
// Later in your app...
|
27 |
|
28 |
// create the view
|
29 |
var aView = new SomeView(); |
30 |
|
31 |
// change the DOM to reflect the newly created view
|
32 |
$('.app').html(aView.render().el); |
33 |
|
34 |
// append more content directly to the DOM using jQuery within
|
35 |
// a Backbone view object
|
36 |
aView.renderWithJQuery(); |
Kode di atas akan menghasilkan dua paragraf pada halaman. Paragraf pertama berisi "Beberapa HTML". Paragraf kedua berisi "HTML Lain".
Untuk menguji pemahaman anda tentang ini, balikkan pemanggilan metode seperti:
1 |
// SomeView is already defined
|
2 |
|
3 |
var aView = new SomeView(); |
4 |
|
5 |
aView.renderWithJQuery(); |
6 |
|
7 |
$('.app').html(aView.render().el); |
Kode di atas akan menghasilkan satu paragraf: "Beberapa HTML". Dalam kedua kasus tersebut, ada juga elemen <p>
tak berisikan apaun di dalamnya. Kita akan membahasnya sebentar lagi.
Memanipulasi DOM di Backbone Views secara efisien
Memahami keajaiban manipulasi DOM yang efisien (dan traversal) membutuhkan pemahaman this.$el
dan this.$()
. Dengan menggunakan this.$el
, kita scoping manipulasi DOM dengan isi yang terkandung dalam view. Dengan menggunakan this.$()
, kita scoping DOM traversal ke pohon DOM dalam view.
Akibatnya, dalam konteks Backbone, beberapa penggunaan $()
(dari pada ini. this.$()
) bisa tidak efisien. Sebagai contoh, katakanlah kita ingin melintasi DOM untuk menemukan beberapa elemen. Kita bisa menggunakan metode traversal DOM yang umum, termasuk .find ()
, .children ()
.closest ()
, . first ()
, dan sebagainya.
Jika kita tahu, priori, bahwa elemen yang kita cari terletak di suatu tempat di dalam view DOM, maka sebaiknya kita gunakan this.$()
untuk menghindari pencarian pohon DOM yang lebih besar yang tidak perlu. Jika elemen yang kita cari terletak di luar view DOM, maka kita harus menggunakan $()
.
Misalnya, metode .specialRender()
menggunakan DOM traversal lokal untuk memastikan bahwa kita mencari elemen dengan kelas empty
dalam konteks tampilan. Jika ditemukan, ia menetapkan konten HTML dari elemen tersebut untuk menyertakan span
dan teks "Tidak lagi kosong".
Kesimpulan
Pada artikel ini, kami meninjau kembali tampilan Backbone, membahas bagaimana membuat tampilan Backbone di DOM, dan mengeksplorasi bagaimana membuat Backbone berfungsi dengan baik dengan perpustakaan lain yang mungkin ingin anda gunakan untuk memanipulasi DOM. Kita juga belajar tentang metode traversal DOM lokal dan metode yang diidentifikasi untuk secara efisien dan tidak efisien melintasi DOM.
Bagian selanjutnya dari artikel ini akan menggali lebih dalam contoh yang lebih rumit untuk mendapatkan banyak perpustakaan agar bisa bekerja sama dalam memanipulasi DOM.