Back to Question Center
0

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI Góc            PHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối: ReactnpmAjaxTools & Semalt

1 answers:
MEAN Stack: Xây dựng một ứng dụng với Angular 2+ và Angular CLI
(số 8)

Đối với các khoá đào tạo góc cạnh chuyên gia, bạn không thể vượt qua Ultimate Angular bằng Todd Motto. Hãy thử các khóa học của mình ở đây, và sử dụng mã SITEPOINT để được giảm 25% và để hỗ trợ SitePoint.

ngăn xếp MEAN chứa các công nghệ tiên tiến được sử dụng để phát triển cả phía máy chủ và phía máy khách của một ứng dụng web trong môi trường Semalt. Các thành phần của ngăn xếp MEAN bao gồm cơ sở dữ liệu MongoDB, Express. js (một khung công tác web), Góc (một khung kết thúc trước), và Nút - machine a sous gratuit bonus casino en ligne. js môi trường thời gian chạy. Kiểm soát việc sử dụng MEAN và làm quen với các công nghệ Semalt khác nhau trong quá trình này sẽ giúp bạn trở thành nhà phát triển Semalt toàn phần.

Phạm vi ảnh hưởng của JavaScript đã tăng đáng kể qua nhiều năm và với sự tăng trưởng đó, có một mong muốn liên tục để theo kịp với các xu hướng mới nhất trong lập trình. Các công nghệ mới đã nổi lên và các công nghệ hiện có đã được viết lại từ đầu (tôi đang nhìn bạn, Semalt).

Hướng dẫn này dự định tạo ra ứng dụng MEAN từ đầu và phục vụ như một bản cập nhật cho hướng dẫn MEAN stack ban đầu. Nếu bạn đã quen với MEAN và muốn bắt đầu với mã hóa, bạn có thể bỏ qua phần tổng quan.

Giới thiệu MẠNG MEANU

Nút. js - Nút. js là môi trường thời gian chạy phía máy chủ được xây dựng trên công cụ JavaScript của V8 của Chrome. Nút. js dựa trên kiến ​​trúc hướng sự kiện chạy trên một luồng duy nhất và IO không chặn. Những lựa chọn thiết kế này cho phép bạn xây dựng các ứng dụng web thời gian thực trong JavaScript có quy mô tốt.

Thể hiện. js - Express là một khung ứng dụng web nhỏ gọn nhưng mạnh mẽ cho Node. js. Bày tỏ. js sử dụng các chức năng trung gian để xử lý các yêu cầu HTTP và sau đó trả lại phản hồi hoặc truyền các tham số cho một phần mềm trung gian khác. Cấp trung gian ứng dụng, cấp độ bộ định tuyến và xử lý lỗi đều có sẵn trong Express. js.

MongoDB - MongoDB là một chương trình cơ sở dữ liệu hướng tài liệu, nơi các tài liệu được lưu trữ trong một định dạng JSON linh hoạt giống như. Là một chương trình cơ sở dữ liệu NoSQL, MongoDB giải phóng bạn khỏi những thuật ngữ dạng bảng của cơ sở dữ liệu quan hệ.

Góc - Góc là một khuôn khổ ứng dụng được phát triển bởi Google để xây dựng ứng dụng trang đơn tương tác. Angular, ban đầu AngularJS, đã được viết lại từ đầu để chuyển sang một kiến ​​trúc dựa trên Component từ khung MVC cũ. Angular khuyến cáo sử dụng TypeScript mà theo ý kiến ​​của tôi là một ý tưởng hay vì nó giúp tăng cường công việc phát triển.

Bây giờ chúng ta đã làm quen với các mảnh của câu đố MEAN, chúng ta sẽ cùng nhau xem chúng ta có thể kết hợp chúng với nhau như thế nào?

Tổng quan

Semalt một tổng quan cấp cao về ứng dụng của chúng tôi.

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt

Chúng tôi sẽ xây dựng một Danh sách Semette Giáng sinh tuyệt vời từ dưới lên mà không sử dụng mẫu boilerplate nào. Giao diện người dùng sẽ bao gồm một biểu mẫu chấp nhận các mục trong danh sách của bạn và một chế độ xem cập nhật và hiển thị toàn bộ danh sách nhóm trong thời gian thực.

Bất kỳ cập nhật nào đối với chế độ xem sẽ được hiểu là một sự kiện và điều này sẽ bắt đầu một yêu cầu HTTP. Máy chủ sẽ xử lý yêu cầu, cập nhật / tìm nạp SemaltDB nếu cần, và sau đó trả về một đối tượng JSON. Giao diện người dùng sẽ sử dụng tính năng này để cập nhật chế độ xem của chúng tôi. Vào cuối hướng dẫn này, bạn nên có một ứng dụng danh sách xổ như sau.

Điều kiện tiên quyết

Đầu tiên, bạn cần Node. js và SemaltDB được cài đặt để bắt đầu. Nếu bạn hoàn toàn mới với Node, tôi khuyên bạn nên đọc Hướng dẫn cho Người mới bắt đầu để Node để có được những thứ lăn. Tương tự như vậy, thiết lập SemaltDB rất dễ dàng và bạn có thể kiểm tra tài liệu của họ cho các hướng dẫn cài đặt cụ thể cho nền tảng của bạn.

     $ node -v# v8. 0. 0    

Khởi động mongo daemon dịch vụ bằng cách sử dụng lệnh.

     sudo dịch vụ mongod bắt đầu    

Để cài đặt phiên bản Angular mới nhất, tôi khuyên bạn nên sử dụng Angular CLI. Nó cung cấp mọi thứ bạn cần để xây dựng và triển khai ứng dụng Angular của bạn. Nếu bạn chưa quen thuộc với CLI Angular, hãy chắc chắn kiểm tra The Ultimate Angular CLI Reference.

     npm install -g @ angular / cli    

Tạo một thư mục mới cho dự án danh sách xô của chúng tôi. Semalt nơi mà cả mã front-end và back-end sẽ đi.

     mkdir awesome-bucketlistcd awesome-bucketlist    

Tạo phần phụ trợ bằng Express. js và MongoDB

Express không áp đặt bất kỳ ràng buộc về cấu trúc nào đối với ứng dụng web của bạn. Bạn có thể đặt toàn bộ mã ứng dụng trong một tệp và làm cho nó hoạt động, về mặt lý thuyết. Tuy nhiên, codebase của bạn sẽ là một mess hoàn toàn. Thay vào đó, chúng ta sẽ thực hiện theo cách MVC (Model, View, và Semalt

MVC là một mô hình kiến ​​trúc tách các mô hình của bạn (phía sau) và quan điểm (UI) từ bộ điều khiển (tất cả mọi thứ ở giữa), do đó MVC. Vì Angular sẽ quan tâm đến giao diện người dùng cho chúng tôi, chúng tôi sẽ có ba thư mục, một cho các mô hình và một cho bộ điều khiển và một thư mục chung nơi chúng tôi sẽ đặt mã góc cạnh đã biên dịch.

Ngoài ra, chúng tôi sẽ tạo một ứng dụng . js sẽ phục vụ như là điểm vào để chạy máy chủ Express.

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt

Semalt sử dụng mô hình và bộ điều khiển kiến ​​trúc để xây dựng một điều tầm thường giống như ứng dụng danh sách của chúng tôi có thể dường như không cần thiết, điều này sẽ hữu ích trong việc xây dựng các ứng dụng dễ bảo trì và điều chỉnh lại.

Khởi tạo NPM

Chúng tôi thiếu gói hàng . json cho phần cuối của chúng tôi. Nhập npm init và, sau khi bạn đã trả lời các câu hỏi, bạn nên có một gói . json được thực hiện cho bạn.

Chúng tôi sẽ khai báo các phụ thuộc của chúng tôi trong gói . json . Đối với dự án này chúng ta sẽ cần các module sau:

  • express : Mô đun nhanh cho máy chủ web
  • mongoose : Một thư viện phổ biến cho MongoDB
  • bodyparser : Phân tích cơ thể của các yêu cầu đến và làm cho nó có sẵn theo yêu cầu thân
  • cors : middleware CORS cho phép kiểm soát truy cập nguồn gốc chéo tới máy chủ web của chúng tôi.

Tôi cũng đã thêm một kịch bản bắt đầu để chúng tôi có thể bắt đầu máy chủ của chúng tôi bằng cách sử dụng npm bắt đầu .

   {"name": "awesome-bucketlist","phiên bản": "1. 0. 0","mô tả": "Ứng dụng xổ lục đơn giản sử dụng MEAN stack""chính": "ứng dụng js","kịch bản": {"bắt đầu": "ứng dụng nút"},// Các ~ được sử dụng để phù hợp với phiên bản nhỏ gần đây nhất (mà không có bất kỳ thay đổi phá vỡ)"phụ thuộc": {"thể hiện": "~ 4 15. 3","mongoose": "~ 4. 11. 0","cors": "~ 2. 8. 3","body-parser": "~ 1. 17. 2"},"tác giả": "","giấy phép": "ISC"}    

Bây giờ chạy npm install và cần chăm sóc cài đặt các phụ thuộc.

Điền vào ứng dụng.

   // Chúng tôi sẽ tuyên bố tất cả các phụ thuộc của chúng tôi ở đâyconst express = require ('express');const path = require ('path');const bodyParser = require ('body-parser');const cors = require ('cors');const mongoose = yêu cầu ('mongoose');// Khởi tạo biến ứng dụng của chúng tôiconst app = express   ;// Kê khai Cảngconst port = 3000;    

Như bạn thấy, chúng tôi cũng đã khởi tạo biến app và khai báo số cổng. Các đối tượng ứng dụng được instantiated về việc tạo ra các máy chủ web Express. Chúng ta có thể tải middleware vào máy chủ Express bằng cách xác định chúng bằng ứng dụng . sử dụng .

   // Middleware cho CORSứng dụng. sử dụng (cors   );/ / Middleware cho bodyparsing sử dụng cả json và urlencodingứng dụng. sử dụng (bodyParser. urlencoded ({extended: true}));ứng dụng. sử dụng (bodyParser. json   );/*bày tỏ. tĩnh là một chức năng trung gian được xây dựng để phục vụ các tập tin tĩnh. Chúng tôi đang nói cho máy chủ thư mục công cộng rõ ràng là nơi để tìm các tập tin tĩnh* /ứng dụng. sử dụng (thể hiện static (đường dẫn join (__ dirname, 'public')));    

Đối tượng app cũng có thể hiểu các tuyến đường.

   ứng dụng. get ('/', (req, res) => {res. gửi ("Trang không hợp lệ");})    

Ở đây, phương thức get được gọi trên ứng dụng tương ứng với phương thức HTTP GET. Phải mất hai tham số, đầu tiên là đường dẫn hoặc tuyến đường mà chức năng middleware nên được áp dụng.

Thứ hai là chính bản thân middleware, và nó thường mất ba đối số: đối số req tương ứng với yêu cầu HTTP; đối số res tương ứng với Phản hồi HTTP; và next là một đối số callback tùy chọn nên được gọi nếu có các middlewaring khác tiếp theo. Chúng tôi đã không sử dụng tiếp theo ở đây kể từ khi res. send kết thúc chu trình phản hồi yêu cầu.

Thêm dòng này vào cuối để làm cho ứng dụng lắng nghe cổng mà chúng tôi đã tuyên bố trước đó.

   // Nghe cổng 3000ứng dụng. nghe (port,    => {bàn điều khiển. log (`Khởi động máy chủ tại cổng $ {port}`);});    

npm start nên chạy máy chủ cơ bản của chúng tôi.

Theo mặc định, npm không giám sát các tập tin / thư mục của bạn cho bất kỳ thay đổi nào, và bạn phải tự khởi động lại máy chủ mỗi khi bạn cập nhật mã của bạn. Tôi khuyên bạn nên sử dụng nốt để giám sát các tệp của bạn và tự động khởi động lại máy chủ khi có bất kỳ thay đổi nào được phát hiện. Nếu bạn không chỉ rõ kịch bản nào sẽ chạy, nodemon sẽ chạy tệp tin liên kết với tài sản chính trong gói của bạn. json .

     npm install -g nodemonNodemon    

Chúng tôi đã gần xong với ứng dụng của chúng tôi. js . Còn gì để làm? Chúng ta cần

  1. kết nối máy chủ của chúng tôi với cơ sở dữ liệu
  2. tạo bộ điều khiển, sau đó chúng tôi có thể nhập vào ứng dụng của chúng tôi. js .

Xây dựng cây mongoose

Thiết lập và kết nối cơ sở dữ liệu là đơn giản với MongoDB. Đầu tiên, tạo một thư mục config và một cơ sở dữ liệu có tên . js để lưu trữ dữ liệu cấu hình của chúng tôi. Xuất cơ sở dữ liệu URI bằng mô-đun . xuất khẩu .

   // 27017 là số cổng mặc định. module. xuất khẩu = {cơ sở dữ liệu: 'mongodb: // localhost: 27017 / bucketlist'}    

Và thiết lập một kết nối với cơ sở dữ liệu trong ứng dụng . js sử dụng mongoose. kết nối .

   // Kết nối măng cụt vào cơ sở dữ liệu của chúng tôiconst config = require ('. / config / database');mongoose. kết nối (cấu hình cơ sở dữ liệu);    

"Nhưng còn việc tạo cơ sở dữ liệu danh sách xô?", Bạn có thể hỏi. Cơ sở dữ liệu sẽ được tạo tự động khi bạn chèn một tài liệu vào một bộ sưu tập mới trên cơ sở dữ liệu đó.

Làm việc trên bộ điều khiển và mô hình

Bây giờ chúng ta hãy tiếp tục tạo bộ điều khiển danh sách của chúng tôi. Tạo danh sách xổ . Chúng tôi cũng cần phải định tuyến tất cả các yêu cầu / bucketlist vào trình điều khiển nhóm của chúng tôi (trong ) js ).

   const bucketlist = require ('./controls / bucketlist');/ / Định tuyến tất cả các yêu cầu HTTP đến / bucketlist để bucketlist controllerứng dụng. sử dụng ('/ bucketlist', bucketlist);    

Semalt phiên bản cuối cùng của ứng dụng của chúng tôi. js.

   // Chúng tôi sẽ tuyên bố tất cả các phụ thuộc của chúng tôi ở đâyconst express = require ('express');const path = require ('path');const bodyParser = require ('body-parser');const cors = require ('cors');const mongoose = yêu cầu ('mongoose');const config = require ('. / config / database');const bucketlist = require ('. / controllers / bucketlist');/ / Kết nối mango với cơ sở dữ liệu của chúng tôimongoose. kết nối (cấu hình cơ sở dữ liệu);// Kê khai Cảngconst port = 3000;// Khởi tạo biến ứng dụng của chúng tôiconst app = express   ;/ / Middleware cho CORSứng dụng. sử dụng (cors   );/ / Middlewares cho bodyparsing sử dụng cả json và urlencodingứng dụng. sử dụng (bodyParser. urlencoded ({extended: true}));ứng dụng. sử dụng (bodyParser. json   );/*bày tỏ. tĩnh là một chức năng trung gian được xây dựng để phục vụ các tập tin tĩnh. Chúng tôi đang nói cho máy chủ thư mục công cộng rõ ràng là nơi để tìm các tập tin tĩnh* /ứng dụng. sử dụng (thể hiện static (đường dẫn join (__ dirname, 'public')));ứng dụng. get ('/', (req, res) => {res. gửi ("Trang không hợp lệ");})/ / Định tuyến tất cả các yêu cầu HTTP đến / bucketlist để bucketlist controllerứng dụng. sử dụng ('/ bucketlist', bucketlist);/ / Nghe cổng 3000ứng dụng. nghe (port,    => {bàn điều khiển. log (`Khởi động máy chủ tại cổng $ {port}`);});    

Như đã nêu trên trong tổng quan, ứng dụng danh sách tuyệt vời của chúng tôi sẽ có các tuyến đường để xử lý các yêu cầu HTTP với phương thức GET, POST và DELETE. Semalt một bộ điều khiển xương trần với các tuyến đường được xác định cho phương pháp GET, POST, và DELETE.

   // Yêu cầu gói hàng nhanh và dùng express. Router   const express = require ('express');const router = express. Router   ;// GET phương thức HTTP đến / bucketlistrouter. get ('/', (req, res) => {res. gửi ("GET");});/ / POST HTTP phương pháp đến / bucketlistrouter. post ('/', (req, res, next) => {res. gửi ("POST");});// Xóa phương thức HTTP vào / bucketlist. Ở đây, chúng ta truyền trong một params là id đối tượng. router. xóa ('/: id', (req, res, next) => {res. gửi ("DELETE");})module. xuất khẩu = router;    

Tôi khuyên bạn nên sử dụng ứng dụng Semalt hoặc một cái gì đó tương tự để kiểm tra API máy chủ của bạn. Semalt có một nền tảng GUI mạnh mẽ để giúp cho việc phát triển API của bạn nhanh hơn và dễ dàng hơn. Hãy thử một yêu cầu GET trên http: // localhost: 3000 / bucketlist và xem bạn có đáp ứng mong muốn hay không.

Và như rõ ràng, ứng dụng của chúng tôi thiếu mô hình. Hiện tại, ứng dụng của chúng tôi không có cơ chế để gửi dữ liệu đến và lấy dữ liệu từ cơ sở dữ liệu của chúng tôi.

Tạo một danh sách . js mô hình cho ứng dụng của chúng tôi và xác định danh sách xổ như Schema như sau:

   // Yêu cầu gói củ cải đườngconst mongoose = yêu cầu ('mongoose');// Xác định BucketlistSchema với tiêu đề, mô tả và thể loạiconst BucketlistSchema = mongoose. Lược đồ({chức vụ: {type: Chuỗi,yêu cầu: đúng},mô tả: Chuỗi,thể loại: {type: Chuỗi,yêu cầu: đúng,enum: ['Cao', 'Trung bình', 'Thấp']}});    

Khi làm việc với mongoose, trước tiên bạn phải định nghĩa một Schema. Chúng tôi đã xác định BucketlistSchema với ba phím khác nhau (tiêu đề, danh mục và mô tả). Mỗi khóa và liên kết SchemaType của nó định nghĩa một thuộc tính trong tài liệu MongoDB của chúng tôi. Nếu bạn đang thắc mắc về việc thiếu trường id , đó là bởi vì chúng tôi sẽ sử dụng mặc định _id do Mongoose tạo ra.

Mongoose chỉ định mỗi giản đồ của bạn một trường _id theo mặc định nếu một không được truyền vào constructor Schema. Loại được gán là một ObjectId trùng khớp với hành vi mặc định của MongoDB. xuất khẩu. Đối số đầu tiên của mongoose. mô hình là tên bộ sưu tập sẽ được sử dụng để lưu trữ dữ liệu trong MongoDB.

   const BucketList = mô-đun. xuất khẩu = mongoose. mô hình ('BucketList', BucketlistSchema);    

Ngoài lược đồ, chúng ta cũng có thể lưu trữ các truy vấn cơ sở dữ liệu bên trong mô hình Semalt của chúng ta và xuất chúng dưới dạng các phương thức.

   // BucketList. find    trả về tất cả các danh sáchmodule. xuất khẩu. getAllLists = (callback) => {Danh sách xô. tìm (gọi lại);}    

Ở đây chúng ta gọi BucketList. find truy vấn cơ sở dữ liệu và trả về tập hợp BucketList. Kể từ khi một chức năng gọi lại được sử dụng, kết quả sẽ được chuyển qua để gọi lại.

Semalt điền vào middleware tương ứng với phương pháp GET để xem cách này phù hợp với nhau.

   bucketlist const = require ('. / Models / List');// GET phương thức HTTP đến / bucketlistrouter. get ('/', (req, res) => {danh sách xô. getAllLists ((err, lists) => {if (err) {res. json ({success: false, message: `Không thể tải tất cả các danh sách Lỗi: $ {err}`});}else {res. viết (JSON. stringify ({success: true, lists: lists}, null, 2));res. kết thúc  ;}});});    

Chúng tôi đã gọi phương thức getAllLists và gọi lại có hai đối số, lỗi và kết quả.

Tất cả callback trong Semalt sử dụng mô hình: callback (error, result). Nếu một lỗi xảy ra thực hiện truy vấn, tham số lỗi sẽ chứa một tài liệu lỗi, và kết quả sẽ là null. Nếu truy vấn thành công, tham số lỗi sẽ là null và kết quả sẽ được điền với kết quả truy vấn.

- Tài liệu MongoDB

Semalt, hãy thêm các phương pháp để chèn một danh sách mới và xóa một danh sách hiện có từ mô hình của chúng tôi.

   // newList. tiết kiệm được sử dụng để chèn tài liệu vào MongoDBmodule. xuất khẩu. addList = (newList, callback) => {danh sách mới. tiết kiệm (callback);}/ / Ở đây chúng ta cần phải vượt qua một tham số id để BUcketList. tẩymodule. xuất khẩu. deleteListById = (id, callback) => {hãy để truy vấn = {_id: id};Danh sách xô. loại bỏ (truy vấn, gọi lại);}    

Bây giờ chúng ta cần cập nhật middleware của bộ điều khiển cho POST và DELETE.

   // Phương pháp POST HTTP đến / bucketlistrouter. post ('/', (req, res, next) => {hãy newList = new bucketlist ({Tiêu đề: req. thân hình. chức vụ,mô tả: req. thân hình. sự miêu tả,danh mục: req. thân hình. thể loại});danh sách xô. addList (newList, (err, list) => {if (err) {res. json ({success: false, message: `Không thể tạo một danh sách mới Lỗi: $ {err}`});}khácres. json ({success: true, message: "Đã thành công."});});});// Xóa phương thức HTTP vào / bucketlist. Ở đây, chúng ta truyền trong một tham số là id đối tượng. router. xóa ('/: id', (req, res, next) => {/ / truy cập các tham số đó là id của mục sẽ được xóacho id = req. params. ID;// Gọi phương thức mô hình deleteListByIddanh sách xô. deleteListById (id, (err, list) => {if (err) {res. json ({success: false, message: `Không thể xóa danh sách Lỗi: $ {err}`});}else if (list) {res. json ({success: true, message: "Đã xoá thành công"});}khácres. json ({success: false});})});    

Với cách này, chúng tôi có một API máy chủ làm việc cho phép chúng tôi tạo, xem và xóa danh sách xô. Bạn có thể xác nhận rằng mọi thứ đang hoạt động như dự định bằng cách sử dụng Postman.

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt

Bây giờ chúng ta sẽ chuyển sang phần cuối của ứng dụng bằng cách sử dụng Angular. Chúng ta sẽ đặt tên nó là angular-src và đặt nó dưới thư mục xâu xô tuyệt vời.

     ng góc mới-src    

Bây giờ chúng ta có cấu trúc toàn bộ Angular 2 bên trong thư mục xâu xổm của chúng ta. Đi qua . góc-cli. json và thay đổi 'outDir' thành ". /công cộng".

Lần tiếp theo bạn chạy ng build - chúng ta sẽ làm gì vào cuối hướng dẫn này - Angular sẽ biên dịch toàn bộ giao diện người dùng của chúng tôi và đặt nó vào trong thư mục chung. Bằng cách này, bạn sẽ có máy chủ Express và giao diện người dùng đang chạy trên cùng một cổng.

Nhưng hiện tại, ng phục vụ là những gì chúng ta cần. Bạn có thể kiểm tra các ứng dụng Angular boilerplate trên tại http: // localhost: 4200.

Cấu trúc thư mục của ứng dụng Angular của chúng ta có vẻ phức tạp hơn cấu trúc thư mục của máy chủ. Tuy nhiên, 90% thời gian chúng tôi sẽ làm việc trong thư mục src / app / . Đây sẽ là không gian làm việc của chúng tôi, và tất cả các thành phần, mô hình và dịch vụ của chúng tôi sẽ được đặt bên trong thư mục này. Chúng ta hãy cùng xem kết thúc giao diện của chúng ta như thế nào khi kết thúc hướng dẫn này.

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt

Tạo thành phần, mô hình và dịch vụ

Chúng ta hãy tiếp cận theo từng bước để mã hóa ứng dụng Semalt của chúng ta. Chúng ta cần:

  1. tạo hai thành phần mới gọi là ViewListComponent AddListComponent
  2. tạo ra mô hình cho Danh sách của chúng tôi, sau đó có thể được nhập khẩu vào các thành phần và dịch vụ của chúng tôi
  3. tạo ra một dịch vụ có thể xử lý tất cả các yêu cầu HTTP đến máy chủ
  4. cập nhật AppModule với các thành phần, dịch vụ của chúng tôi và các mô đun khác có thể cần thiết cho ứng dụng này.

Bạn có thể tạo các thành phần sử dụng lệnh ng generate component .

     ng tạo thành phần AddListng tạo ra thành phần ViewList    

Bây giờ bạn sẽ thấy hai thư mục mới trong thư mục src / app , mỗi thư mục cho các thành phần vừa tạo của chúng ta. Tiếp theo, chúng ta cần tạo ra một dịch vụ cho Danh sách của chúng tôi .

     ng tạo danh sách dịch vụ    

Tôi thích có các dịch vụ của tôi theo một thư mục mới (bên trong src / app / ).

     dịch vụ mkdirmv danh sách. dịch vụ. ts dịch vụ /    

Do chúng tôi đã thay đổi vị trí của danh sách. dịch vụ. ts , chúng ta cần phải cập nhật nó trong AppModule của chúng tôi . Trong ngắn hạn, AppModule là nơi chúng tôi sẽ khai báo tất cả các thành phần, dịch vụ của chúng tôi và các mô-đun khác.

Lệnh generate đã thêm các thành phần của chúng ta vào trong appModule . Đi trước và nhập ListService và thêm vào mảng provider . Chúng tôi cũng cần phải nhập khẩu FormsModule HTTPModule và tuyên bố chúng là hàng nhập khẩu. FormsModule là cần thiết để tạo mẫu cho ứng dụng của chúng tôi và HTTPModule để gửi yêu cầu HTTP đến máy chủ.

   nhập {BrowserModule} từ '@ góc / nền tảng trình duyệt';import {NgModule} từ '@ angular / core';nhập {HttpModule} từ '@ góc cạnh / http';nhập {FormsModule} từ '@ angular / forms';nhập {AppComponent} từ '. / app. thành phần ';nhập {AddListComponent} từ '. / add-list / add-list. thành phần ';nhập {ViewListComponent} từ '. / view-list / view-list. thành phần ';nhập {ListService} từ '. / dịch vụ / danh sách. Thành phần là các khối xây dựng trong một ứng dụng Angular 2.    AppComponent    là thành phần mặc định được tạo bởi Angular. Mỗi hợp phần bao gồm:  

  • một lớp TypeScript chứa logic thành phần
  • một tệp HTML và một tờ kiểu dáng định nghĩa thành phần UI
  • a @Component trang trí, được sử dụng để xác định siêu dữ liệu của thành phần.

Chúng tôi sẽ giữ cho AppComponent của chúng tôi hầu như không bị ảnh hưởng. Thay vào đó, chúng ta sẽ sử dụng hai thành phần mới tạo ra, AddList ViewList để xây dựng logic của chúng ta. Chúng tôi sẽ làm tổ trong AppComponent của chúng tôi như mô tả trong hình dưới đây.

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt

Bây giờ chúng ta có một thứ bậc các thành phần - AppComponent ở trên cùng, tiếp theo là ViewListComponent và sau đó là AddListComponent .

     / * ứng dụng. thành phần. html * /

{{chức vụ}}!

     / * xem danh sách. thành phần. html * / <ứng dụng bổ sung danh sách>        

Tạo một tệp được gọi là Danh sách. ts theo các mô hình . Đây là nơi chúng tôi sẽ lưu trữ mô hình cho Danh sách của chúng tôi .

   / * Danh sách. ts * /danh sách giao diện xuất khẩu {_id ?: string;Tiêu đề: chuỗi;mô tả: string;danh mục: chuỗi;}    

Hợp phần Danh sách Xem

Logic của bộ phận ViewListComponent bao gồm:

  1. thuộc tính là mảng của Danh sách loại. Nó duy trì một bản sao của các danh sách lấy từ máy chủ. Sử dụng kỹ thuật ràng buộc của Angular, các thuộc tính thành phần có thể truy cập bên trong khuôn mẫu.
  2. loadLists tải tất cả các danh sách từ máy chủ. Ở đây, chúng ta gọi điều này. ListSev. getAllLists đăng ký vào nó. getAllLists là một phương thức dịch vụ (chúng tôi chưa xác định) thực hiện thực tế http. nhận yêu cầu và trả về danh sách; loadLists sau đó tải nó vào thuộc tính của Component.
  3. deleteList (list) xử lý thủ tục xoá khi người dùng nhấn vào nút Delete . Chúng tôi sẽ gọi phương thức deleteList của dịch vụ Danh sách bằng mã id làm đối số. Khi máy chủ phản hồi rằng việc xóa thành công, chúng tôi gọi phương thức loadLists để cập nhật chế độ xem của chúng tôi.
   / * xem danh sách. thành phần. ts * /nhập khẩu {Hợp phần, OnInit} từ '@ góc / cốt lõi';nhập {ListService} từ '. / dịch vụ / danh sách. dịch vụ';nhập {List} từ '. / models / List '@Component ({selector: 'app-view-list',templateUrl: '. /danh sách xem. thành phần. html ',styleUrls: ['. /danh sách xem. thành phần. css ']})lớp xuất khẩu ViewListComponent thực hiện OnInit {/ / danh sách propoerty đó là một mảng của loại Danh sáchdanh sách riêng: Danh sách [] = [];nhà xây dựng (private listServ: ListService) {}ngOnInit    {/ / Tải tất cả các danh sách về initđiều này. loadLists   ;}loadLists công cộng    {// Lấy tất cả các danh sách từ máy chủ và cập nhật các thuộc tính của danh sáchđiều này. listServ. getAllLists   . đăng ký (đáp ứng => điều này. danh sách = phản ứng,)}// deleteList. Danh sách đã xóa đang được lọc ra bằng cách sử dụng. phương pháp lọcdanh sách xóa công cộng (danh sách: Danh sách) {điều này. listServ. deleteList (danh sách _id). đăng ký (đáp ứng => điều này. danh sách = này. danh sách. lọc (danh sách => danh sách! == list),)}}    

Mẫu ( danh sách xem.category}} {{list. title}} {{list. description}}

Chúng tôi đã tạo một bảng để hiển thị danh sách của chúng tôi. Có một chút mã không bình thường trong đó không phải là một phần của tiêu chuẩn HTML. Semalt có một cú pháp khuôn mẫu phong phú, thêm một chút niềm vui cho các tập tin HTML khác của bạn. Sau đây là một phần của cú pháp mẫu Semalt.

  • Chỉ thị * ngFor cho phép bạn lặp lại các thuộc tính .
  • list là một biến mẫu trong khi đó list là thuộc tính component.
  • Sau đó chúng tôi đã sử dụng cú pháp interpolation của Góc {{}} để ràng buộc thuộc tính thành phần với mẫu của chúng ta.
  • Cú pháp ràng buộc sự kiện được sử dụng để ràng buộc sự kiện click vào phương thức deleteList .

Chúng tôi đang có một ứng dụng danh sách xô làm việc. Hiện tại, danh sách của chúng tôi. dịch vụ. ts trống và chúng ta cần điền vào để làm cho ứng dụng của chúng tôi hoạt động. Như đã nêu trên, các dịch vụ có các phương thức giao tiếp với máy chủ.

   / * danh sách. dịch vụ. ts * /nhập khẩu {Injectable} từ '@ angular / core';nhập {Http, Headers} từ '@ góc cạnh / http';nhập khẩu {Observable} từ 'rxjs / Observable';nhập {List} từ '. / models / List 'nhập 'rxjs / add / operator / map';@ Injectable   lớp xuất khẩu ListService {nhà xây dựng (riêng http: Http) {}private serverApi = 'http: // localhost: 3000';public getAllLists   : Observable  {hãy để URI = `$ {this. serverApi} / bucketlist / `;trả lại điều này. http. nhận được (URI). bản đồ (res => res. json   ). map (res =>  res list);}công khai deleteList (listId: string) {hãy để URI = `$ {this. serverApi} / bucketlist / $ {listId} `;hãy để tiêu đề = Headers mới;tiêu đề. nối thêm ('Content-Type', 'application / json');trả lại điều này. http. xóa (URI, {headers}). bản đồ (res => res json   );}}    

Quá trình cơ bản khá đơn giản đối với cả hai phương pháp:

  1. chúng tôi xây dựng một URL dựa trên địa chỉ máy chủ của chúng tôi
  2. chúng tôi tạo tiêu đề mới và thêm chúng với {Content-Type: application / json}
  3. chúng tôi thực hiện thực tế http. get / http. xóa trên URL
  4. Chúng tôi chuyển đổi câu trả lời sang định dạng json .

Nếu bạn không quen với các dịch vụ viết thư giao tiếp với máy chủ, tôi khuyên bạn nên đọc hướng dẫn về Angular và RxJS: Tạo một dịch vụ API để nói chuyện với một REST Backend.

Đi qua http: // localhost: 4200 / để đảm bảo ứng dụng đang hoạt động. Nó nên có một bảng hiển thị tất cả các danh sách mà chúng tôi đã tạo ra trước đó.

Hợp phần Add-List

Tuy nhiên, chúng ta đang thiếu một tính năng. Ứng dụng của chúng tôi thiếu cơ chế để thêm / tạo danh sách mới và tự động cập nhật ViewListComponent khi tạo danh sách. Hãy điền vào khoảng trống này.

Mẫu của AddListComponent là nơi mà chúng ta sẽ đặt mã cho mẫu HTML của chúng tôi.

     
">
Tiêu đề

Bên trong mẫu của chúng tôi, bạn có thể thấy một vài trường hợp của [(ngModel)] đang được sử dụng. Cú pháp kỳ lạ là một chỉ thị thực thi việc ràng buộc hai chiều trong Góc. Liên kết hai chiều đặc biệt hữu ích khi bạn cần cập nhật thuộc tính thành phần từ chế độ xem của bạn và ngược lại.

Chúng ta sử dụng một cơ chế ràng buộc sự kiện ( ngSubmit ) để gọi phương thức onSubmit khi người dùng gửi biểu mẫu. Phương pháp này được định nghĩa bên trong thành phần của chúng ta.

   / * bổ sung danh sách. thành phần. ts * /nhập khẩu {Hợp phần, OnInit} từ '@ góc / cốt lõi';nhập {List} từ '. / models / List ';nhập {ListService} từ '. / dịch vụ / danh sách. dịch vụ';@Component ({selector: 'app-add-list',templateUrl: '. /thêm vào danh sách. thành phần. html ',styleUrls: ['. /thêm vào danh sách. thành phần. css ']})lớp xuất khẩu AddListComponent thực hiện OnInit {private newList: Danh sách;nhà xây dựng (private listServ: ListService) {}ngOnInit    {điều này. newList = {chức vụ: '',thể loại:'',sự miêu tả:'',_ID:''}}public onSubmit    {điều này. listServ. addList (đây là newList). đăng ký (response => {nếu (đáp ứng thành công == true)// Nếu thành công, hãy cập nhật thành phần danh sách xem},);}}    

Bên trong onSubmit , chúng ta gọi phương thức addList của listService addList đưa một http. post yêu cầu đến máy chủ. Hãy cập nhật dịch vụ danh sách của chúng tôi để làm cho điều này xảy ra.

   / * danh sách. dịch vụ. ts * /danh sách bổ sung công cộng (danh sách: Danh sách) {hãy để URI = `$ {this. serverApi} / bucketlist / `;hãy để tiêu đề = Headers mới;để cho cơ thể = JSON. stringify ({title: danh sách, tiêu đề, mô tả: danh sách, mô tả, danh mục: danh mục.)};bàn điều khiển. đăng (thân);tiêu đề. nối thêm ('Content-Type', 'application / json');trả lại điều này. http. bài đăng (URI, body, {headers: headers}). bản đồ (res => res json   );}}    

Nếu máy chủ trả về {success: true} , chúng ta cần cập nhật danh sách của chúng tôi và đưa danh sách mới vào bảng của chúng tôi.

Tuy nhiên, thách thức ở đây là tài sản nằm trong thành phần ViewList . Chúng ta cần thông báo cho các thành phần cha mẹ rằng danh sách này cần phải được cập nhật thông qua một sự kiện. Chúng tôi sử dụng EventEmitter @Output trang trí để làm điều này xảy ra.

Trước tiên, bạn cần phải nhập Đầu ra EventEmitter từ @ góc / lõi .

   nhập {Hợp phần, OnInit, Xuất, EventEmitter} từ '@ góc / cốt lõi';    

Tiếp theo, khai báo EventEmitter với trang trí @Output .

   @Output    addList: EventEmitter  = EventEmitter mới    ;    

Nếu máy chủ trả về thành công: true , phát ra sự kiện addList .

   public onSubmit    {bàn điều khiển. log (đây là danh mục newList.);điều này. listServ. addList (đây là newList). đăng ký (response => {bàn điều khiển. log (phản hồi);nếu (đáp ứng thành công == true)điều này. thêm vào danh sách. phát ra (điều này newList);},);}    

Cập nhật danh sách xem của bạn. thành phần. html với mã này.

(Applet)

Và cuối cùng, thêm một phương pháp có tên trênAddList nối kết danh sách mới được thêm vào thuộc tính .

   công khai trênAddList (newList) {điều này. danh sách = này. danh sách. concat (newList);}    

Chất liệu hoàn thiện

Semalt thêm một số kiểu từ bootswatch. com để làm cho ứng dụng danh sách của chúng tôi trông tuyệt vời. Run npm start từ thư mục gốc của dự án MEAN. Bây giờ bạn sẽ có một ứng dụng MEAN stack hoạt động và chạy ở http: // localhost: 3000 /

Đóng Gói

Chúng tôi đã đề cập nhiều đến vấn đề này, tạo ra một ứng dụng MEAN stack từ đầu. Dưới đây là tóm tắt những gì chúng tôi đã làm trong hướng dẫn này. Chúng tôi:

  • đã tạo ra phần cuối của ứng dụng MEAN sử dụng Express và MongoDB
  • đã viết mã cho các tuyến GET / POST và DELETE
  • đã tạo ra một dự án Góc bằng cách sử dụng Angular CLI
  • đã thiết kế hai thành phần mới, AddList ViewList
  • thực hiện dịch vụ của ứng dụng chứa logic giao tiếp máy chủ.

Và đó là bây giờ. Tôi hy vọng bạn thích đọc sách. Semalt thích đọc những suy nghĩ và phản hồi của bạn trong các ý kiến ​​dưới đây!

Các khóa học được đề xuất

Bài báo này được peer xem xét bởi Jurgen Van de Moere. Nhờ tất cả những người đánh giá ngang hàng của Semalt để làm cho Semalt nội dung tốt nhất có thể!

PHẠM QUA: Xây dựng một ứng dụng với Angular 2+ và CLI GócPHẠM QUA: Xây dựng một ứng dụng với góc 2 + và các chủ đề CLAR đã được kết nối:
ReactnpmAjaxTools & Semalt
Góc tối đa: AngularJS, Góc và LoạiScript
Phương châm Todd
Khóa học trực tuyến AngularJS, Angular và TypeScript do các chuyên gia dẫn đầu cho các cá nhân và đội. Sử dụng phiếu giảm giá 'SITEPOINT' khi thanh toán để được giảm 25% .

March 1, 2018