Việc sử dụng JavaScript ở đâu trong giao diện người dùng?
Tìm hiểu cách xây dựng ứng dụng web mặt trước bằng JavaScript đơn giản với nỗ lực tối thiểu. Không sử dụng bất kỳ khung hoặc thư viện (của bên thứ ba) nào, chẳng hạn như jQuery hoặc Angular, tạo ra các phần phụ thuộc hộp đen và chi phí hoạt động, đồng thời ngăn cản bạn tự học cách thực hiện Show
Giới thiệuBài viết này đã được trích xuất từ cuốn sách Xây dựng ứng dụng web giao diện người dùng bằng JavaScript đơn giản, có sẵn dưới dạng sách trực tuyến truy cập mở. Nó chỉ ra cách xây dựng ứng dụng giao diện người dùng với nỗ lực tối thiểu, không sử dụng bất kỳ khung hoặc thư viện (bên thứ ba) nào. Mặc dù các thư viện và khung có thể giúp tăng năng suất, nhưng chúng cũng tạo ra các phụ thuộc hộp đen và chi phí hoạt động, đồng thời ngăn cản bạn tự học cách thực hiện Nếu trước tiên bạn muốn xem nó hoạt động như thế nào và nó trông như thế nào, bạn có thể chạy ứng dụng tối thiểu được thảo luận trong bài viết này từ máy chủ của chúng tôi Ứng dụng web mặt trước có thể được cung cấp bởi bất kỳ máy chủ web nào, nhưng nó được thực thi trên thiết bị máy tính của người dùng (điện thoại thông minh, máy tính bảng hoặc máy tính xách tay) chứ không phải trên máy chủ web từ xa, như được minh họa bằng sơ đồ kiến trúc sau Thông thường, nhưng không nhất thiết, ứng dụng web giao diện người dùng là ứng dụng một người dùng, không được chia sẻ với những người dùng khác Phiên bản tối thiểu của ứng dụng quản lý dữ liệu đầu cuối JavaScript được thảo luận trong hướng dẫn này chỉ bao gồm tối thiểu chức năng tổng thể cần thiết cho một ứng dụng hoàn chỉnh. Nó chỉ xử lý một loại đối tượng (_______01) và hỗ trợ bốn thao tác quản lý dữ liệu tiêu chuẩn (Tạo/Đọc/Cập nhật/Xóa), nhưng nó cần được nâng cao bằng cách tạo kiểu cho giao diện người dùng bằng các quy tắc CSS và bằng cách thêm các phần quan trọng khác
Lý lịchPhần này cung cấp một cuộc thảo luận ngắn gọn về HTML và một số yếu tố của JavaScript, giả sử rằng người đọc đã quen thuộc với các khái niệm lập trình cơ bản và có một số kinh nghiệm về lập trình, chẳng hạn như PHP, Java hoặc C# HTMLChúng tôi áp dụng phương trình ký hiệu
tuyên bố rằng khi chúng tôi chỉ nói "HTML" hoặc "HTML5", chúng tôi thực sự muốn nói đến XHTML5, bởi vì chúng tôi thích cú pháp rõ ràng của các tài liệu XML hơn là cú pháp kiểu HTML4 tự do và khó hiểu cũng được HTML5 cho phép Đối tượng JavaScriptCác đối tượng JavaScript khác với các đối tượng OO/UML cổ điển. Đặc biệt, họ không cần khởi tạo một lớp. Và chúng có thể có các phương thức (cấp độ thể hiện) của riêng chúng ở dạng các vị trí phương thức, vì vậy chúng không chỉ có các vị trí thuộc tính (thông thường) mà còn có các vị trí phương thức. Ngoài ra, chúng cũng có thể có các vị trí khóa-giá trị. Vì vậy, chúng có thể có ba loại vị trí khác nhau, trong khi các đối tượng cổ điển (được gọi là "đặc tả cá thể" trong UML) chỉ có các vị trí thuộc tính Các đối tượng JavaScript có thể được sử dụng theo nhiều cách khác nhau cho các mục đích khác nhau. Dưới đây là năm trường hợp sử dụng khác nhau hoặc ý nghĩa có thể có của các đối tượng JavaScript
bản đồBản đồ được xử lý với sự trợ giúp của một vòng lặp đặc biệt trong đó chúng tôi lặp qua tất cả các khóa của bản đồ bằng cách sử dụng hàm được xác định trước var o = new C(...)4, trả về một mảng gồm tất cả các khóa của bản đồ var o = new C(...)5. Ví dụ, JavaScript var myRecord = { firstName:"Tom", lastName:"Smith", age:26}1 Để thêm một phần tử mới vào bản đồ, chúng ta chỉ cần tạo một mục nhập khóa-giá trị mới như trong JavaScript var myRecord = { firstName:"Tom", lastName:"Smith", age:26}2 Để xóa một phần tử khỏi bản đồ, chúng ta có thể sử dụng toán tử JavaScript var o = new C(...)6 được xác định trước như trong JavaScript var myRecord = { firstName:"Tom", lastName:"Smith", age:26}4 JavaScript hỗ trợ ba loại cấu trúc dữ liệuBa loại cấu trúc dữ liệu (hoặc kiểu dữ liệu phức tạp) là
Định nghĩa và khởi tạo một lớpMột lớp có thể được định nghĩa trong hai bước. Đầu tiên, xác định hàm xây dựng xác định các thuộc tính của lớp và gán cho chúng các giá trị của các tham số của hàm tạo JavaScript var myRecord = { firstName:"Tom", lastName:"Smith", age:26}5 Tiếp theo, xác định các phương thức cấp thể hiện của lớp dưới dạng các khe hàm của thuộc tính đối tượng nguyên mẫu của hàm tạo JavaScript var numeral2number = { "one":1, "two":2, "three":3}0 Cuối cùng, các phương thức cấp độ lớp ("tĩnh") có thể được định nghĩa là các khe hàm của hàm tạo, như trong JavaScript var numeral2number = { "one":1, "two":2, "three":3}1 Một thể hiện của một lớp được tạo bằng cách áp dụng toán tử var o = new C(...)7 cho hàm tạo JavaScript var numeral2number = { "one":1, "two":2, "three":3}2 Phương thức var o = new C(...)8 được gọi trên đối tượng var o = new C(...)9 o.constructor.name // returns "C"0 bằng cách sử dụng 'ký hiệu dấu chấm' JavaScript var numeral2number = { "one":1, "two":2, "three":3}3 Mã hóa ứng dụngMục đích của ứng dụng ví dụ của chúng tôi là quản lý thông tin về sách. Đó là, chúng tôi xử lý một loại đối tượng duy nhất. var o = new C(...)1, như mô tả trong hình dưới đây Chúng ta cần gì cho một ứng dụng quản lý thông tin như vậy?
Để nhập dữ liệu với sự trợ giúp của bàn phím và màn hình máy tính, chúng tôi có thể sử dụng các biểu mẫu HTML, cung cấp công nghệ giao diện người dùng cho các ứng dụng web Để duy trì một bộ sưu tập các đối tượng dữ liệu, chúng ta cần một công nghệ lưu trữ cho phép lưu giữ các đối tượng dữ liệu trong các bản ghi liên tục trên thiết bị lưu trữ thứ cấp, chẳng hạn như đĩa cứng hoặc đĩa trạng thái rắn. Các trình duyệt web hiện đại cung cấp hai công nghệ như vậy. cái đơn giản hơn được gọi là Bộ nhớ cục bộ và cái mạnh hơn được gọi là IndexedDB. Đối với ứng dụng ví dụ tối thiểu của chúng tôi, chúng tôi sử dụng Bộ nhớ cục bộ Bước 1 - Thiết lập cấu trúc thư mụcỞ bước đầu tiên, chúng tôi thiết lập cấu trúc thư mục cho ứng dụng. Chúng tôi chọn tên cho ứng dụng của mình, chẳng hạn như "Thư viện công cộng" và tên tương ứng (có thể viết tắt) cho thư mục ứng dụng, chẳng hạn như "publicLibrary". Sau đó, chúng tôi tạo thư mục này trên đĩa máy tính của mình và thư mục con "src" cho các tệp mã nguồn JavaScript của chúng tôi. Trong thư mục này, chúng tôi tạo các thư mục con "model", "view" và "ctrl", theo mô hình Model-View-Controller cho kiến trúc ứng dụng phần mềm. Và cuối cùng chúng tôi tạo một chỉ mục. html cho trang bắt đầu của ứng dụng, như được thảo luận bên dưới. Vì vậy, chúng tôi kết thúc với cấu trúc thư mục sau var numeral2number = { "one":1, "two":2, "three":3}4 Trang bắt đầu của ứng dụng tải Sách. js và cung cấp một menu để chọn một trong các thao tác quản lý dữ liệu CRUD được thực hiện bởi một trang tương ứng, chẳng hạn như createBook. html hoặc để tạo dữ liệu thử nghiệm với sự trợ giúp của quy trình o.constructor.name // returns "C"2 hoặc xóa tất cả dữ liệu bằng o.constructor.name // returns "C"3 Chỉ mục trang bắt đầu của ứng dụng tối thiểu. htmlHTML var numeral2number = { "one":1, "two":2, "three":3}5 Bước 2 - Viết mã mẫuTrong bước thứ hai, chúng tôi viết mã của lớp mô hình của mình trong một tệp JavaScript cụ thể. Trong mô hình thiết kế thông tin ở trên, chỉ có một lớp, đại diện cho loại đối tượng var o = new C(...)1. Vì vậy, trong thư mục src/model, chúng ta tạo một tệp Book. js ban đầu chứa đoạn mã sau JavaScript var numeral2number = { "one":1, "two":2, "three":3}6 Lớp mô hình var o = new C(...)1 được mã hóa dưới dạng một hàm tạo JavaScript với một tham số duy nhất là o.constructor.name // returns "C"6, được coi là một đối tượng bản ghi có các thuộc tính o.constructor.name // returns "C"7, o.constructor.name // returns "C"8 và o.constructor.name // returns "C"9, biểu thị các giá trị cho ISBN, tiêu đề và các thuộc tính năm của lớp var o = new C(...)1. Do đó, trong hàm tạo, các giá trị của thuộc tính o.constructor.name // returns "C"6 được gán cho các thuộc tính tương ứng bất cứ khi nào một đối tượng mới được tạo như một thể hiện của lớp này Ngoài việc định nghĩa lớp mô hình dưới dạng hàm khởi tạo, chúng ta còn định nghĩa các mục sau trong Sách. tập tin js
1. Đại diện cho bộ sưu tập của tất cả các phiên bản SáchĐể đại diện cho tập hợp của tất cả các trường hợp var o = new C(...)1 được quản lý bởi ứng dụng, chúng tôi xác định và khởi tạo thuộc tính cấp lớp var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12 theo cách sau JavaScript var numeral2number = { "one":1, "two":2, "three":3}7 Vì vậy, ban đầu bộ sưu tập sách của chúng tôi trống rỗng. Trên thực tế, nó được định nghĩa là một đối tượng trống, vì chúng tôi muốn biểu diễn nó dưới dạng bản đồ (một tập hợp các vị trí khóa-giá trị, còn được gọi là 'bản đồ băm') trong đó ISBN là khóa để truy cập đối tượng sách tương ứng ( . Chúng ta có thể hình dung cấu trúc của một bản đồ như vậy dưới dạng bảng tra cứu, như trong Bảng 1 Bảng 1. Một bản đồ đại diện cho một bộ sưu tập sáchKeyValue006251587X{ isbn. "006251587X," tiêu đề. "Dệt web", năm. 2000 }0465026567{ isbn. "0465026567," tiêu đề. "Gödel, Escher, Bach", năm. 1999 }0465030793{ isbn. "0465030793," tiêu đề. "I Am A Strange Loop", năm. 2008 }Lưu ý rằng các giá trị của bản đồ này là các đối tượng bản ghi đơn giản tương ứng với các hàng của bảng. Do đó, chúng ta cũng có thể biểu diễn chúng trong một bảng đơn giản, như trong Bảng 2 ban 2. Một tập hợp các đối tượng sách được biểu diễn dưới dạng bảngISBNTitleYear006251587XWeaving the Web20000465026567Gödel, Escher, Bach19990465030793I Am A Strange Loop20082. Đang tải tất cả các phiên bản SáchĐể lưu trữ dữ liệu liên tục, chúng tôi sử dụng Bộ nhớ cục bộ, là API JavaScript HTML5 được các trình duyệt web hiện đại hỗ trợ. Tải bản ghi sách từ Bộ nhớ cục bộ bao gồm ba bước
Đây là mã đầy đủ của thủ tục JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };1 Lưu ý rằng vì thao tác nhập như var myRecord = { firstName:"Tom", lastName:"Smith", age:26}48 có thể không thành công, nên chúng tôi thực hiện thao tác đó trong khối var myRecord = { firstName:"Tom", lastName:"Smith", age:26}49- var myRecord = { firstName:"Tom", lastName:"Smith", age:26}50, nơi chúng tôi có thể theo dõi thông báo lỗi bất cứ khi nào thao tác nhập không thành công 3. Lưu tất cả các phiên bản SáchLưu tất cả các đối tượng sách từ bộ sưu tập var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12 trong bộ nhớ chính vào Bộ nhớ cục bộ trong bộ nhớ phụ bao gồm hai bước
Hai bước này được thực hiện ở dòng 5 và dòng 6 của danh sách chương trình sau JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };4 4. Tạo một phiên bản Sách mớiThủ tục var myRecord = { firstName:"Tom", lastName:"Smith", age:26}18 đảm nhiệm việc tạo một phiên bản var o = new C(...)1 mới và thêm nó vào bộ sưu tập var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12 JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };5 5. Cập nhật một phiên bản Sách hiện cóĐể cập nhật một phiên bản var o = new C(...)1 hiện có, trước tiên chúng tôi truy xuất nó từ var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12, sau đó gán lại các thuộc tính đó mà giá trị của nó đã thay đổi JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };6 Lưu ý rằng trong trường hợp thuộc tính số (chẳng hạn như o.constructor.name // returns "C"9), chúng ta phải đảm bảo rằng giá trị của tham số đầu vào tương ứng ( var numeral2number = { "one":1, "two":2, "three":3}03), thường được lấy từ đầu vào của người dùng thông qua biểu mẫu HTML, được chuyển đổi từ var numeral2number = { "one":1, "two":2, "three":3}04 sang var numeral2number = { "one":1, "two":2, "three":3}05 với một 6. Xóa một phiên bản Sách hiện cóTrường hợp var o = new C(...)1 bị xóa khỏi bộ sưu tập var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12 bằng cách kiểm tra trước nếu bản đồ có một phần tử với khóa đã cho (dòng 2), sau đó áp dụng toán tử var o = new C(...)6 tích hợp trong JavaScript. , xóa một vị trí khỏi một đối tượng hoặc, trong trường hợp của chúng tôi, một phần tử khỏi bản đồ JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };7 7. Tạo dữ liệu thử nghiệmĐể có thể kiểm tra mã của chúng tôi, chúng tôi có thể tạo một số dữ liệu thử nghiệm và lưu nó vào cơ sở dữ liệu Bộ nhớ cục bộ của chúng tôi. Chúng ta có thể sử dụng thủ tục sau đây cho việc này JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };8 8. Xóa tất cả dữ liệuQuy trình sau đây xóa tất cả dữ liệu khỏi Bộ nhớ cục bộ JavaScript var person1 = { lastName: "Smith", firstName: "Tom", getInitials: function () { return this.firstName.charAt(0) + this.lastName.charAt(0); } };9 Bước 3 - Khởi tạo ứng dụngChúng tôi khởi tạo ứng dụng bằng cách xác định không gian tên và không gian con MVC. Không gian tên là một khái niệm quan trọng trong công nghệ phần mềm và nhiều ngôn ngữ lập trình, bao gồm Java và PHP, cung cấp hỗ trợ cụ thể cho các không gian tên, giúp nhóm các đoạn mã có liên quan và tránh xung đột tên. Vì không có hỗ trợ cụ thể cho không gian tên trong JavaScript, nên chúng tôi sử dụng các đối tượng đặc biệt cho mục đích này (chúng tôi có thể gọi chúng là "đối tượng không gian tên"). Đầu tiên, chúng tôi xác định một không gian tên gốc (đối tượng) cho ứng dụng của mình, sau đó chúng tôi xác định ba không gian tên con, một cho mỗi phần trong số ba phần của mã ứng dụng. mô hình, xem và điều khiển. Trong trường hợp ứng dụng ví dụ của chúng tôi, chúng tôi có thể sử dụng đoạn mã sau cho việc này JavaScript var myApp = { model:{}, view:{}, ctrl:{} }; 0Ở đây, không gian tên chính được xác định là var numeral2number = { "one":1, "two":2, "three":3}11, viết tắt của "Public Library", với ba không gian tên con var numeral2number = { "one":1, "two":2, "three":3}12, var numeral2number = { "one":1, "two":2, "three":3}13 và var numeral2number = { "one":1, "two":2, "three":3}14 ban đầu là các đối tượng trống. Chúng tôi đặt mã này trong một tệp khởi tạo riêng. js trong thư mục ctrl, vì định nghĩa không gian tên như vậy thuộc về phần điều khiển của mã ứng dụng Bước 4 - Triển khai ca sử dụng đối tượng danh sáchTrường hợp sử dụng này tương ứng với "Đọc" từ bốn trường hợp sử dụng quản lý dữ liệu cơ bản Tạo-Đọc-Cập nhật-Xóa (CRUD) Giao diện người dùng cho trường hợp sử dụng này được cung cấp bởi trang HTML sau có chứa bảng HTML để hiển thị các đối tượng sách. Đối với ứng dụng ví dụ của chúng tôi, trang này sẽ được gọi là listBooks. html (trong thư mục chính publicLibrary) và sẽ chứa mã HTML sau HTML var myApp = { model:{}, view:{}, ctrl:{} }; 1Lưu ý rằng tệp HTML này tải ba tệp JavaScript. tệp điều khiển src/ctrl/khởi tạo. js, tệp mô hình src/model/Book. js và tệp xem src/view/listBooks. js. Hai tệp đầu tiên chứa mã để khởi chạy ứng dụng và cho lớp mô hình var o = new C(...)1 như đã giải thích ở trên và tệp thứ ba, đại diện cho mã giao diện người dùng của hoạt động "danh sách sách", hiện được phát triển. Trên thực tế, đối với thao tác này, chúng ta chỉ cần một thủ tục để thiết lập bối cảnh quản lý dữ liệu và giao diện người dùng, được gọi là var numeral2number = { "one":1, "two":2, "three":3}16 JavaScript var myApp = { model:{}, view:{}, ctrl:{} }; 2Logic đơn giản của thủ tục này bao gồm hai bước
Cụ thể hơn, quy trình var numeral2number = { "one":1, "two":2, "three":3}16 trước tiên tạo các đối tượng sách từ các hàng tương ứng được truy xuất từ Bộ nhớ cục bộ bằng cách gọi var numeral2number = { "one":1, "two":2, "three":3}18 và sau đó tạo bảng dạng xem trong một vòng lặp trên tất cả các vị trí khóa-giá trị của bản đồ var myRecord = { firstName:"Tom", lastName:"Smith", age:26}12 trong đó mỗi giá trị đại diện cho một đối tượng var numeral2number = { "one":1, "two":2, "three":3}20. Trong mỗi bước của vòng lặp này, một hàng mới được tạo trong thành phần nội dung bảng với sự trợ giúp của thao tác DOM JavaScript var numeral2number = { "one":1, "two":2, "three":3}21, sau đó ba ô được tạo trong hàng này với sự trợ giúp của thao tác DOM var numeral2number = { "one":1, "two":2, "three":3}22. cái đầu tiên cho giá trị thuộc tính o.constructor.name // returns "C"7 của đối tượng sách và cái thứ hai và thứ ba cho giá trị thuộc tính o.constructor.name // returns "C"8 và o.constructor.name // returns "C"9 của nó. Cả var numeral2number = { "one":1, "two":2, "three":3}26 và var numeral2number = { "one":1, "two":2, "three":3}27 đều phải được gọi với đối số var numeral2number = { "one":1, "two":2, "three":3}28 để đảm bảo rằng các phần tử mới được thêm vào danh sách các hàng và ô Bước 5 - Triển khai Ca sử dụng Tạo đối tượngĐối với thao tác quản lý dữ liệu với đầu vào của người dùng, chẳng hạn như thao tác "tạo đối tượng", trang HTML có biểu mẫu HTML được yêu cầu làm giao diện người dùng. Biểu mẫu có một trường biểu mẫu cho từng thuộc tính của lớp var o = new C(...)1. Đối với ứng dụng ví dụ của chúng tôi, trang này sẽ được gọi là createBook. html (trong thư mục ứng dụng publicLibrary) và sẽ chứa mã HTML sau HTML var myApp = { model:{}, view:{}, ctrl:{} }; 3Tệp mã xem src/view/createBook. js chứa hai thủ tục
JavaScript var myApp = { model:{}, view:{}, ctrl:{} }; 4Bước 6 - Triển khai Trường hợp sử dụng đối tượng cập nhậtMột lần nữa, chúng ta có một trang giao diện người dùng ( var numeral2number = { "one":1, "two":2, "three":3}34) và một tệp mã xem (src/view/updateBook. js). Biểu mẫu HTML cho giao diện người dùng của thao tác "đối tượng cập nhật" có trường lựa chọn để chọn sách sẽ được cập nhật và trường biểu mẫu cho từng thuộc tính của lớp var o = new C(...)1. Tuy nhiên, trường biểu mẫu cho thuộc tính số nhận dạng tiêu chuẩn (ISBN) ở dạng chỉ đọc vì chúng tôi không cho phép thay đổi số nhận dạng tiêu chuẩn của một đối tượng hiện có HTML var myApp = { model:{}, view:{}, ctrl:{} }; 5Quy trình var numeral2number = { "one":1, "two":2, "three":3}16 hiện phải thiết lập trường lựa chọn bằng cách truy xuất bộ sưu tập tất cả các đối tượng sách từ kho lưu trữ dữ liệu liên tục để điền vào danh sách tùy chọn của phần tử ________ 237 JavaScript var myApp = { model:{}, view:{}, ctrl:{} }; 6Bước 7 - Thực hiện Ca sử dụng Xóa đối tượngĐối với trường hợp sử dụng "xóa đối tượng", biểu mẫu giao diện người dùng chỉ có một trường lựa chọn để chọn sách sẽ bị xóa HTML var myApp = { model:{}, view:{}, ctrl:{} }; 7Mã xem trong src/view/deleteBook. js bao gồm hai thủ tục sau JavaScript var myApp = { model:{}, view:{}, ctrl:{} }; 8Chạy ứng dụng và lấy mãBạn có thể chạy ứng dụng tối thiểu từ máy chủ của chúng tôi và tìm thêm tài nguyên về kỹ thuật web, bao gồm sách truy cập mở, về kỹ thuật web. thông tin Các biến thể và tiện ích mở rộng có thểSử dụng IndexDB thay vì LocalStorageThay vì sử dụng API lưu trữ cục bộ, API IndexDB có thể được sử dụng để lưu trữ cục bộ dữ liệu ứng dụng. Với Bộ nhớ cục bộ , bạn chỉ có một cơ sở dữ liệu (bạn có thể phải chia sẻ cơ sở dữ liệu này với các ứng dụng khác trong cùng một miền) và không có hỗ trợ cho các bảng cơ sở dữ liệu ( . Với IndexedDB , bạn có thể thiết lập cơ sở dữ liệu cụ thể cho ứng dụng của mình và bạn có thể xác định các bảng cơ sở dữ liệu, được gọi là 'kho lưu trữ đối tượng', có thể có các chỉ mục để truy cập . Ngoài ra, vì IndexedDB hỗ trợ cơ sở dữ liệu lớn hơn nên các phương thức truy cập của nó không đồng bộ và chỉ có thể được gọi trong ngữ cảnh giao dịch cơ sở dữ liệu. Ngoài ra, để lưu trữ từ xa dữ liệu ứng dụng với sự trợ giúp của API web (REST), người ta có thể sử dụng thành phần giải pháp phụ trợ hoặc . Phương pháp lưu trữ từ xa cho phép quản lý cơ sở dữ liệu lớn hơn và hỗ trợ các ứng dụng nhiều người dùng. Expressing Date/Time Information with the ElementGiả sử rằng lớp mô hình var o = new C(...)1 của chúng tôi có một thuộc tính bổ sung var numeral2number = { "one":1, "two":2, "three":3}39, các giá trị của thuộc tính này phải được đưa vào các bảng và biểu mẫu HTML. Mặc dù các mục thông tin ngày/giờ phải được định dạng dưới dạng chuỗi ở dạng con người có thể đọc được trên các trang web, tốt nhất là ở dạng được bản địa hóa dựa trên cài đặt trình duyệt của người dùng, không nên lưu trữ giá trị ngày/giờ ở dạng này. Thay vào đó, chúng tôi sử dụng các phiên bản của lớp JavaScript được xác định trước var numeral2number = { "one":1, "two":2, "three":3}40 để biểu diễn và lưu trữ các giá trị ngày/giờ. Trong biểu mẫu này, các hàm được xác định trước var numeral2number = { "one":1, "two":2, "three":3}41 và var numeral2number = { "one":1, "two":2, "three":3}42 có thể được sử dụng để chuyển các giá trị var numeral2number = { "one":1, "two":2, "three":3}40 thành các chuỗi ngày/giờ theo tiêu chuẩn ISO (có dạng "2015-01-27") hoặc thành các chuỗi ngày/giờ được bản địa hóa (như "27. 1. 2015"). Lưu ý rằng, để đơn giản, chúng tôi đã bỏ qua phần thời gian của chuỗi ngày/giờ Tóm lại, một giá trị ngày/giờ được thể hiện dưới ba dạng khác nhau
Khi một giá trị ngày/giờ được đưa vào một trang web, chúng ta có thể sử dụng phần tử var numeral2number = { "one":1, "two":2, "three":3}47 cho phép hiển thị một biểu diễn mà con người có thể đọc được (thường là một chuỗi ngày/giờ được bản địa hóa) được chú thích bằng một tiêu chuẩn (có thể đọc được bằng máy) Chúng tôi minh họa việc sử dụng phần tử var numeral2number = { "one":1, "two":2, "three":3}47 bằng ví dụ sau về trang web bao gồm hai phần tử var numeral2number = { "one":1, "two":2, "three":3}47. một để hiển thị một ngày cố định và một phần tử khác (ban đầu trống) để hiển thị ngày hôm nay, được tính toán với sự trợ giúp của hàm JavaScript. Trong cả hai trường hợp, chúng tôi sử dụng thuộc tính var numeral2number = { "one":1, "two":2, "three":3}50 để chú thích ngày hiển thị mà con người có thể đọc được với biểu diễn tương ứng có thể đọc được bằng máy HTML var myApp = { model:{}, view:{}, ctrl:{} }; 9Trang web này tải và thực thi hàm JavaScript sau để tính toán ngày hôm nay dưới dạng giá trị var numeral2number = { "one":1, "two":2, "three":3}40 và gán biểu diễn tiêu chuẩn ISO và biểu diễn được bản địa hóa của nó cho phần tử var numeral2number = { "one":1, "two":2, "three":3}47 JavaScript var o = new C(...)0 Điểm chú ýMã của ứng dụng này nên được mở rộng bởi
Chúng tôi chỉ ra cách thực hiện việc này trong hướng dẫn tiếp theo Hướng dẫn ứng dụng web JavaScript mặt trước Phần 2. Thêm xác thực ràng buộc Một vấn đề khác với mã do-it-yourself của ứng dụng ví dụ này là mã soạn sẵn cần thiết cho mỗi lớp đối với các phương pháp quản lý lưu trữ dữ liệu var numeral2number = { "one":1, "two":2, "three":3}53, var numeral2number = { "one":1, "two":2, "three":3}54, v.v. Mặc dù viết mã này một vài lần để học cách phát triển ứng dụng là tốt, nhưng bạn không muốn viết đi viết lại mã này sau này khi bạn làm việc trên các dự án thực tế. Trong một bài viết khác, Xác thực ràng buộc khai báo và đáp ứng với mODELcLASSjs, chúng tôi trình bày một cách tiếp cận làm thế nào để đặt các phương thức này ở dạng chung, sao cho chúng có thể được sử dụng lại cho tất cả các lớp của ứng dụng Dự án thực hànhVui lòng đặt bất kỳ câu hỏi nào về các dự án này trong phần nhận xét CodeProject bên dưới Dự án 1 - Phát triển ứng dụng JavaScript Front-End để quản lý dữ liệu phimMục đích của ứng dụng là quản lý thông tin về phim. Giống như trong ứng dụng quản lý dữ liệu sách được thảo luận trong hướng dẫn, bạn có thể đặt giả định đơn giản hóa rằng tất cả dữ liệu có thể được lưu trong bộ nhớ chính. Vì vậy, khi khởi động ứng dụng, dữ liệu phim được đọc từ kho lưu trữ dữ liệu liên tục. Khi người dùng thoát khỏi ứng dụng, dữ liệu phải được lưu vào kho lưu trữ dữ liệu liên tục, kho dữ liệu này sẽ được triển khai với API lưu trữ cục bộ của JavaScript, như trong hướng dẫn Ứng dụng chỉ xử lý một loại đối tượng. var numeral2number = { "one":1, "two":2, "three":3}55, như được mô tả trong Hình bên dưới. Trong các phần tiếp theo của hướng dẫn, bạn sẽ mở rộng ứng dụng đơn giản này bằng cách thêm các ràng buộc toàn vẹn, diễn viên và đạo diễn dưới dạng các lớp mô hình khác và các liên kết giữa chúng Lưu ý rằng trong hầu hết các phần của dự án này, bạn có thể theo dõi hoặc thậm chí sao chép mã của ứng dụng quản lý dữ liệu sách, ngoại trừ việc hiện tại có một thuộc tính có phạm vi Ngày, vì vậy bạn phải sử dụng phần tử HTML Để phát triển ứng dụng, chỉ cần làm theo trình tự bảy bước được mô tả trong hướng dẫn
Dự án 2 - Quản lý dữ liệu liên tục với IndexedDBCải thiện ứng dụng của bạn được phát triển trong dự án 1 bằng cách thay thế việc sử dụng API lưu trữ cục bộ để lưu trữ dữ liệu liên tục bằng cách sử dụng API IndexedDB mạnh mẽ hơn Môn lịch sử
Giấy phépBài viết này, cùng với bất kỳ mã nguồn và tệp liên quan nào, được cấp phép theo Giấy phép Mở Dự án Mã (CPOL) |