Biến scss góc
Bài viết này tôi sẽ giải thích rõ từng thành phần cấu trúc và cách code Angular 4. Chúng ta sẽ đi lần lượt từ dễ đến khó về các khái niệm trong Angular 4, giúp bạn có cái nhìn tổng thể về cách code chuẩn nhất một hệ thống sử dụng Angular Show
Phiên bản mới nhất của Angular hiện tại là bản 6, tuy nhiên, phiên bản chính thức được sử dụng rất tốt bởi nhiều doanh nghiệp Doanh nghiệp, công ty lớn (ứng dụng nhiều người dùng, ứng dụng dành cho doanh nghiệp) và được Google . That main is phiên bản Angular 4. Do đó chúng ta hãy lấy bản này làm chuẩn. Còn bản 5, bản 6 thật ra đang là phiên bản thử nghiệm cho cộng đồng để tăng hiệu suất, thêm nhiều cách code hay ho hơn, cũng nhưng ẩn nhiều bug hơn nếu xử lý code không tốt Nếu bạn chưa biết gì hoặc mới học code Angular, bạn vẫn có thể sử dụng bài viết này để tham khảo và học hỏi cách code. Hãy upvote, chia sẻ bạn bè và clip (bookmark) bài viết này nếu bạn thấy hữu ích nhé 1. Các thành phầnCác thành phần là một mã khối trong ứng dụng Angular. Nó là sự kết hợp của bộ mẫu html (bộ khung html) và nhúng kèm theo mã TypeScript (hoặc Javascript). Các thành phần là độc lập với nhau và độc lập với hệ thống. Nó có thể được cài đặt vào hoặc loại bỏ khỏi hệ thống một cách dễ dàng. Một thành phần có thể hiểu là một điều khiển trên màn hình hiển thị, bao gồm giao diện html và logic mã xử lý sự kiện đi kèm điều khiển đó. Một thành phần cũng có thể lớn như là cả 1 màn hình chứa nhiều điều khiển hoặc một nhóm nhiều màn hình. Tức giận là một thành phần cũng có thể chứa và được gọi là nhiều thành phần khác được kết nối vào. Như vậy Angular 4 rất linh hoạt trong việc chia nhỏ code ra các thành phần Trong Angular 4 chúng ta khai báo một Component với cấu trúc như sau
Như chúng ta thấy từ khóa @Component sẽ giúp định nghĩa một bộ khung html cho nó. Và bên dưới là một class HelloWorld dùng để viết code logic. Trong định nghĩa bộ khung html, chúng ta có một số thuộc tính cần chú ý sau đây
Angular có cách code Binding (kết nối giữa html và dữ liệu) dữ liệu theo kiểu 2 chiều, nghĩa là html input thay đổi thì biến javascript sẽ ngay lập tức nhận giá trị được trả về và đảo ngược, giá trị trong js thay đổi thì . Chúng ta không cần phải đi nhanh từng giá trị của các ô đầu vào như thời gian sử dụng jQuery nữa. Để ràng buộc một chuỗi ra ngoài màn hình html thì rất đơn giản, sử dụng 2 dấu ngoặc nhọn 27 Ví dụ chúng ta có một Thành phần đơn giản như sau
That is show string string. Nhưng nếu bạn muốn hiển thị giá trị đã có ra một văn bản đầu vào ô, thì phải viết 2 dấu ngoặc nhọn 28 như sau
Chú ý một chút, trong ví dụ này thì 29 là từ khóa html chứ không phải tên biến, 30 mới là tên biến dùng để truyền vào cho 31 nhưng chúng ta không đóng 30 mà đóng khung 29. Điều này cho phép chúng ta linh hoạt để gán giá trị cho bất cứ thuộc tính html nào cũng được 33. Xử lý sự kiện Để gắn một sự kiện của một điều khiển html với một hàm javascript, trong Angular 4 chúng ta viết như sau 5Khi chúng tôi viết (nhấp chuột) tức thì là muốn ràng buộc sự kiện nhấp chuột của người dùng trong điều khiển này và gọi hàm updateTime() tương ứng trong mã của Thành phần này để xử lý 3. 1 Xử lý tác vụ của người dùngEvent thì có nhiều loại. Nếu sự kiện nhấp chuột, thì đơn giản là khi nhấn xong chúng ta mới xử lý hành động. Nhưng có một số loại sự kiện cần xử lý dữ liệu ngay trong lúc người dùng đang thao tác. Ví dụ người dùng gõ phím trên văn bản đầu vào, người dùng chọn một tùy chọn trong danh sách thả xuống, giá trị đang được chọn phải phản ánh ngay sang một điều khiển khác không có giới hạn Lúc này chúng ta cần sử dụng đến các sự kiện biến. Đoạn mã ví dụ sau đây, ngay khi người dùng nhập phím vào hộp văn bản, giá trị của hộp văn bản sẽ được lưu lại vào một biến 35 7____183. 2 Xử lý thao tác của người dùng (ngon hơn cách 3. 1)Cách viết mã ở ví dụ 3. 1 hoàn toàn chạy ngon và không ai bắt bẻ gì. Nhưng vấn đề là biến sự kiện, nó chứa rất nhiều chức năng/thành phần bên trong (nó chứa toàn bộ hàm xử lý hàng trăm loại sự kiện khác nhau của một thành phần, một điều khiển). Do đó sẽ không thông minh khi gửi và nhận cả một cục bộ như vậy đã đưa javascript sang trong khi cái chúng ta cần chỉ là giá trị đang được nhập của hộp văn bản Vui lòng viết lại đoạn mã vừa rồi như sau 9 0Như chúng ta thấy, hàm updateValue() lúc này nhận truyền vào là một biến 36 (biến này được gọi là mỹ miều là 37) và 38 sẽ chứa giá trị được liên kết với hộp văn bản hiện tạiCách viết này rất được khuyến khích sử dụng. Các bạn bác quá thì viết kiểu 3. 1 cũng được nhưng nếu biết chính xác cái sự kiện mình cần là gì thì nên viết theo 3. 2 3. 3 Xử lý sự kiện ràng buộc 2 chiềuCấm, tôi đã bảo đảm các bạn đã viết như thế này là ràng buộc 2 chiều
Nhưng tôi lừa các bạn đấy, viết như thế này chỉ là ràng buộc một chiều, nghĩa là chỉ hiển thị được giá trị ra thôi chứ không lấy được giá trị từ html tự động bỏ vào tiêu đề biến. Ví dụ viết như sau thì giá trị của 39 sẽ không thay đổi bất cứ điều gì khi ta nhập vào ô đầu vào 0Từ phiên bản Angular 2 trở lên thì anh Google đã quyết định là không nên cái gì cũng ràng buộc 2 chiều Đó là vì bind 2 chiều sẽ làm khổ html. Nó sẽ phải hiển thị liên tục khi người dùng nhập vào đầu vào ô 40Rất đơn giản, lúc này chúng ta sẽ viết theo kiểu nối Viết theo cú pháp bên dưới đây sẽ giúp bạn liên kết được 2 chiều, khi nhập vào ô đầu vào thì giá trị của 39 sẽ thay đổi tương ứng 1Từ khóa 42 lúc này không phải là thuộc tính html nữa mà nó là từ khóa của Angular 4. Khi viết 43 chúng ta sẽ buộc chặt giá trị của html đầu vào với biến 30. Dẫn đến việc người dùng nhập vào ô này thì biến js 30 thay đổi theo => ô h1 hiện giá trị tương ứng của 30. Cách viết 47 được gọi là 48 hay nôm na là 494. Sử dụng các trường ngModel và biểu mẫuTừ khóa 42 như ta thấy bên trên, có thể dùng để ràng buộc 2 chiều. Hiện đại hơn, biến này còn chứa cả các lớp CSS được gắn với biến mô hình có thể hiển thị tính hợp lệ của dữ liệu được nhập vào điều khiển biểu mẫu 2Biến vm trong thành phần gồm 2 thuộc tính là fname và lname. Chúng ta ràng buộc nó bằng 2 đầu vào html để nhập giá trị cho nó. Tuy nhiên, cần phải xác thực giá trị nhập vào. Nên kiểm tra bằng cách gọi {{fname. className}} to view class of input textbox current is what is what Chú ý, khi sử dụng ngModel trong một biểu mẫu html. Bắt buộc phải có thuộc tính 51. Nếu không có thì sẽ bị báo lỗi như sauNếu ngModel được sử dụng trong thẻ biểu mẫu, thuộc tính tên phải được đặt hoặc điều khiển biểu mẫu phải được xác định là 'độc lập' trong ngModelOptions Chúng ta sẽ có các class tự động sinh ra ở input type="text" như sau
Các lớp sẽ tự động sinh ra và gắn vào mỗi đầu vào khi có sự thay đổi dữ liệu trên biểu mẫu. Và nhiệm vụ của bạn là định nghĩa kiểu css tương ứng với các thay đổi đó. Ví dụ 3Sau khi áp dụng phong cách, thì sẽ như sau 5. ngModuleMô-đun là khái niệm mở rộng nhất của Angular. Một mô-đun có thể bao gồm các thành phần, chỉ thị, đường ống, v. v Mô-đun có thể được biên dịch (biên dịch) dưới định dạng trước thời hạn (AoT). Nghĩa là biên dịch ra mã thực thi để hiển thị luôn trên trình duyệt mà không cần vẽ hay gì từ đầu. Hãy tưởng tượng thành phần có html và js viết riêng, khi tải trang thì thứ 2 này mới làm mát chung để hiển thị html+data lên màn hình. AoT là thứ html+data đã sẵn sàng Mô-đun cũng có thể gọi mô-đun con và bắt tay với các mô-đun khác Ví dụ về mô-đun chúng ta có thể bắt gặp ngay trong ứng dụng. mô-đun. ts 4Như vậy thì bản thân một ứng dụng Angular chính là một mô-đun cho tất cả, trong đó cài đặt nhiều mô-đun con Các thuộc tính của module được định nghĩa như sau
Một dịch vụ là một đoạn mã trong ứng dụng Angular mà phục vụ cho nhiệm vụ gì đó, xử lý logic mã gì đó. Ví dụ xử lý (xử lý) dữ liệu gửi nhận từ/đến một API, hoặc cung cấp hàm xác thực Tất nhiên là dịch vụ thì chỉ có mã không có giao diện Để tạo ra một dịch vụ, chúng ta cần nhập và mô tả một lớp với từ khóa 52 lấy từ mô-đun 53Ta hãy lấy một ví dụ 5Sau khi định nghĩa lớp TimeService là 54, chúng ta sẽ gọi dịch vụ này ở nhiều vị trí khác nhau trong ứng dụng6. 1 lần tiêm phụ thuộc (DI)Khi một lớp muốn được gọi (được tiêm vào, tiêm vào) một thành phần cần gọi hàm bên trong nó, chúng ta cần sử dụng đến Dependency Injection. Và rất đơn giản chỉ cần gọi hàm khởi tạo (hàm tạo) của thành phần là sẽ đưa dịch vụ vào để sử dụng nó bên trong thành phần đó 66. 2 Viết dịch vụ dưới dạng chungNếu chúng ta sử dụng dịch vụ ở nhiều nơi cùng lúc và không muốn khai báo nhiều lần, thành phần nào cũng phải tiêm nó vào. Lúc này có thể khai báo dịch vụ ở phần 55 của mô-đun hoặc thành phần luôn 77. chỉ thịCác chỉ thị có thể được hiểu như là các đoạn mã typescript (hoặc javascript) kèm theo cả html và khi gọi thì gọi như là html luôn, ví dụ 8Từ Angular 2 trở đi, các chỉ thị được chia làm các loại sau đây
7. 1 Ng-nếu… khácĐây là một chỉ thị cấu trúc, có tác dụng kiểm tra điều kiện ngay tại html. Ví dụ 9Mã ở trên, khi tiêu đề biến có giá trị, thì chuỗi 58 được hiển thị ra. And the local 59 is hideaway,backback, other condition are running and 60 are being outNhư ta thấy dùng cái directive 61 này rất tiện lợi khi có thể ẩn hiện html dễ dàng7. 2 Ng-MẫuThis also as a Structural directives. Nó giúp gom html cục bộ cần hiện 0Chú ý là đoạn mã vừa rồi sử dụng 62. Cách viết này đầy đủ hơn của 7. 17. 3 Ng-ContainerTương tự như 63 used to gom html. Nhưng điểm mạnh của 64 là chỉ thị thẻ này không hiển thị ra thẻ 65 html như là 66 mà thẻ sẽ được ẩn đi, giúp bố cục css không bị phá vỡ nếu bạn gom html (Không sợ bị nhảy từ div cha sang div con, cấu trúc Vui lòng xem ví dụ sau đây 1Will be render ra as after Khi soi html chúng ta sẽ thấy. Dòng div tự hoang có 68 nó lại chèn một thuộc tính 69, dẫn đến dòng đó bị xuống dòng, làm sai thiết kế bố cụcBây giờ hãy viết lại như sau 2Kết quả sẽ nuột nà ngay Đó là bởi vì html đã được sắp xếp gọn gàng. 7. 4 NgSwitch và NgSwitchCaseChúng ta hoàn toàn có thể sử dụng câu lệnh điều kiện switch case trong Angular y như switch case trong Javascript vậy Cách viết như sau 3Trong trường hợp muốn sử dụng switch case default ( if full case k a screen thì to default) thì chúng ta viết như sau 47. 5 hàm đầu vàoMột lệnh hoàn toàn có thể nhận giá trị truyền vào để hiển thị hoặc tính toán Hãy xem một ví dụ sau đây. Giả sử chúng ta khai báo một 70 như bình thường. Nhưng có thêm một biến 71 định nghĩa với từ khóa 72 5Chúng ta định nghĩa template html của component như sau 6Khi gọi render ra component login thì truyền biến Input cho nó như sau 7Nếu bạn muốn giá trị của biến 71 được lấy động từ một biến khác, thì vẫn có thể viết như sau nhé 8Trong đó 74 là biến true or false tùy tình hình 75showĐăng ký 76show-đăng ký 77vẫn được nhé, hãy viết như sau khi khai báo @Input() 9 307. 6 hàm đầu raMột chỉ thị nhận giá trị về để hiển thị được. Do đó, có thể có bất kỳ bên nào trong chỉ thị trả lại giá trị ngược lại không? Lúc này chúng ta sẽ cần sử dụng đến EventEmitter (lấy giá trị trả lại từ sự kiện của người dùng thao tác). Ví dụ khi người dùng nhập xong id và mật khẩu của một chỉ thị. Chúng ta muốn nhận giá trị đã nhập ở một chỉ thị gọi chỉ thị đăng nhập chứ không chỉ xử lý id và pass bên trong chỉ thị đăng nhập Lúc này cần nhập thư viện EventEmitter trước 31Sau đó khai báo một 78 đầu ra và biến này có kiểu là EventEmitter. Chú ý lúc này đang viết trong chỉ thị con 32At the html of directive con then handle event click normal 33Và ở code logic thì shot value nhận được từ đầu vào gửi sang cho thằng 79 đang chờ chuực sẵn 34Giờ thì sang viết ở 80 gọi 81, chúng ta sẽ dùng 79 và gán nó cho hàm 83 để chỉ thị cha toàn quyền xử lý 35Trong lệnh cha, giờ mã lệnh thì sự kiện nhận được từ lệnh con sẽ bao gồm Đối tượng truyền sang (là id và chuyển đầu vào từ lệnh con) 36Như vậy là chúng ta đã biết cách bắn giá trị từ 84 sang 80 rồi nhé8. Phát hiện thay đổi trong AngularĐể ràng buộc được 2 chiều thì rõ ràng Angular phải có cơ chế để phát hiện sự thay đổi, cho dù là từ html hay là biến js thay đổi giá trị, đều phải quét lần lượt các thành phần thì mới biết được cái gì thay đổi Angular dùng cơ chế quét từ trên xuống dưới (từ trên xuống), tức là từ thành phần cha rồi đến thành phần con được kiểm tra lần 86Rất đơn giản, mỗi thành phần trong Angular đều có một lớp đi kèm với nó để so sánh. Khi có sự thay đổi giá trị của từng biến trong thành phần (do người dùng nghịch với các sự kiện), lúc này giá trị ban đầu của thành phần được lưu trước đó sẽ lấy ra so sánh. Nếu mô hình có sự thay đổi, hiển thị là Angular lập tức gọi html đang làm việc, hiển thị giá trị mới trên DOM ngay lập tức Đó là cách lưu giá trị và so sánh các kiểu dữ liệu giá trị như string, bool, int. Còn nếu dữ liệu là kiểu lớp phức tạp mà người dùng định nghĩa ra. Thì lúc này cơ chế so sánh giá trị sẽ sử dụng 1 trong 2 cách sau So sánh nông (So sánh nông). Tức là một số thuộc tính của biến này (biến này là một lớp để) thay đổi, cả biến đó vẫn không được nhận xét là đã thay đổi và không cập nhật giá trị. Tại sao lại so sánh khập khiễng như thế này? . Rõ ràng là cần phải tạo một biến mới để chứa giá trị thay đổi chứ không phải bản thân giá trị đó k được phép thay đổi => cập nhật làm gì cho mất công So sánh sâu (So sánh sâu). Move times of each property of the variable and so sánh giá trị đã bị thay đổi. Dĩ nhiên là toàn bộ giá trị của lớp phải được lưu lại trước đó để so sánh. Khi một số thuộc tính bị thay đổi, toàn bộ biến đó coi như bị thay đổi và toàn bộ html cần thay đổi theo 9. Transclusion (trao đổi giữa các chỉ thị) trong AngularỞ mục 7, chúng ta đã biết về việc một Chỉ thị có thể nhận đầu vào và cả đầu ra. Nhưng chúng ta chỉ có thể nhập và xuất lệnh tại thuộc tính html của thẻ gọi chỉ thị. Ví dụ 87Nếu bây giờ chúng ta lại muốn viết vào giữa thẻ gọi chỉ thị thì sao? Trong Angular bản 1. X thì có một khái niệm là Transclusion (trao đổi giá trị giữa các directive). Lên Angular 4 thì vẫn hỗ trợ. Lúc này ta có thể viết như sau 37Sau khi định nghĩa ra 88 như bên trên, ta muốn lấy ruột của nó là chữ 89 và ở chỗ khác thì sử dụng một 90 để ra như sau 38Chỗ này hơi khó hiểu một chút vì không có lời gọi directive (component) Rõ ràng là công việc lấy được html ruột của chỉ thị cực kỳ hữu ích khi chúng ta có thể chứa html của 95 trong đó không giới hạn và chỉ cần khai báo 1 lần ở nhiều nơi10. Use observables at now htmlChúng ta biết Observables là luồng dữ liệu được gửi nhận từ api. Đài quan sát sẽ chứa dữ liệu json từ máy chủ gửi tới nhưng nó không phải là dữ liệu json thuần. Nếu đưa luồng dữ liệu này cho html thì nó sẽ không hiểu được để hiển thị ra màn hình. Tuy nhiên, với từ khóa pipe async chúng ta có thể ra trực tiếp như sau 39Lúc này biến 96 được gọi kèm theo từ khóa 97, dữ liệu bên trong nó sẽ được đưa ra htmlNếu chúng ta có một mảng ở dạng Observables thì cũng hoàn toàn có thể in ra trực tiếp bằng cách sử dụng async 98 5011. Unable to input value NullTypeScript 4 hỗ trợ việc kiểm tra giá trị Null hoặc Undefined và không cho phép gán 2 loại giá trị này cho một biến đã được khai báo theo kiểu cụ thể. Ví dụ 51Một biến cũng hoàn toàn có thể được khai báo là một trong 2 kiểu dữ liệu, như ví dụ dưới đây 52Mặc dù không nói gì, Typescript sẽ bậttrictNullCheck là true. Do đó, nếu muốn chuỗi có thể chứa cả giá trị null, chúng ta có thể tắt nó đi bằng cách sửa đổi trong tệp 99To call api from server, Angular đã trang sẵn sàng cho bạn bộ dịch vụ http nằm ở thư viện 00. Chúng ta chỉ việc inject ( đưa vào) constructor của component để bắt đầu sử dụng. Sau đó viết mã gọi api như sau 53Hàm 01 sẽ trả về cho bạn một dạng dữ liệu có thể quan sát được. Nó sẽ giúp mã của bạn chạy nhanh và không bị đơ vì phải chờ yêu cầu đến máy chủ. Cách mã của observable cũng rất linh hoạt giúp cho phép bạn thao tác với dữ liệu ngay khi nhận được. Ví dụ ta xử lý như sau 54Chú ý là chỗ này chúng ta sử dụng đến hàm 02 của rxjs nên phải nhập nó vào rồi mới bắt đầu sử dụng được nhé 55Dùng hàm map thì chúng ta vẫn chưa lấy được dữ liệu json thực sự, cần phải dùng hàm subcribe để đọc ra cái data đã được map 56 03May thay cho you, is still have a way writing for people. that is used to function pipe 97Ví dụ đây 57Và để hiển thị biến 05 ra thì ở html chúng ta viết như sau 58 06Chúng ta có thể sử dụng dấu chấm để gọi các thuộc tính con của nó 59Chú thích một chút chỗ này. 07 cách viết này chắc chắn là dino có giá trị khác null thì mới gọi thuộc tính con của nó ra. Cách viết này rất hay sẽ giúp tránh được ngoại lệ tham chiếu null và rất ngắn gọn13. Nhưng tôi yêu cách code kiểu Promise, ghét tôi ObservablesTrong Angular, default, rxjs used to handle data return from http request. Nhưng nếu chúng ta thích trả lại Promises cho dễ thao tác hơn. Thì rxjs đã hoàn thành toàn bộ câu trả lời. Chúng ta sẽ có hàm 08 70Cách sử dụng như sau 71This time to get data from local Promises then used to callback function 72Và ở html không cần sử dụng async gì ngang cứ bắn ra giá trị nào 73
14. bộ định tuyến Khi sử dụng Router, chúng ta sẽ có thể xây dựng nên một trang web SPA (Single Page Application). Khi viết một mẫu tuyến đường, các thành phần sẽ được ánh xạ tương ứng với các URL cố định. And when click into link, url will load component which does not need load back both page. Dẫn đến hiệu ứng là trang web chạy trong 1 tab và các màn hình được tải động. Cách hoạt động này khác với MPA (Ứng dụng nhiều trang) thông thường thì mỗi màn hình sẽ có url tương ứng và phải bật một tab riêng trên trình duyệt Bộ định tuyến cũng có bộ đệm, tức là thành phần đã tải một lần thì sẽ được tải lại không cần tải toàn bộ về từ máy chủ nữa Để bắt đầu sử dụng Bộ định tuyến, khi tạo dự án bằng Angular CLI, chúng ta chạy dòng lệnh sau đây 74Còn nếu dự án của bạn đã có sẵn và ứng dụng Bộ định tuyến chưa được áp dụng, hãy chạy đoạn lệnh sau để thêm Định tuyến vào ứng dụng của bạn 7514. 1 ổ cắm bộ định tuyếnMỗi một Router sẽ có một URL để tải thành phần. Và để biết được là thành phần sẽ hiển thị ra vị trí nào thì chúng ta viết đoạn mã sau vào khung html cần chèn 7614. 2 Cài đặt Route cho ứng dụng AngularĐể cài đặt toàn bộ Bộ định tuyến cho một ứng dụng Angular, chúng ta cần tạo ra một đối tượng JSON chứa các thuộc tính như sau
Vui lòng xem đoạn mã ví dụ về Bộ định tuyến bên dưới 7714. 3 tuyến đường conKhi chúng ta muốn một trang có các trang con bên trong nó. Ví dụ: Dữ liệu lưới sẽ bao gồm các trang Thêm, Sửa, Xóa tương ứng. Lúc này chúng ta viết thêm thuộc tính 16 cho Route cha. 16 là một đối tượng JSON giống đối tượng Route chaCách viết như sau 78 18 79Như vậy là các thành phần nếu sử dụng Route để định nghĩa cho nhau thì chúng ta sẽ sử dụng lại biến 19 để kết xuất con của nó14. 4 tham sốToàn bộ dữ liệu có thể được truyền từ màn hình này sang màn hình kia bằng cách đưa giá trị vào trong url để gọi (hay còn gọi là cách gọi hàm bằng cách truyền URL tham số) Các bước để thực hiện công việc này như sau
80
81Kết bàiBài này là một bài dịch. Link bài gốc ở đây. https. //www. dotnetcurry. com/angular/1385/angular-4-cheat-sheet Hi vọng các bạn sẽ chia sẻ thật nhiều cho bạn bè của mình và lưu lại bài viết này để tham khảo về sau. Hẹn gặp lại các bạn trong các bài sắp tới |