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
Đố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 - tambo colorado tourism. 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. 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.
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.
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;
// 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
- kết nối máy chủ của chúng tôi với cơ sở dữ liệu
- 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ủamongoose. 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.
![]()
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.
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:
- tạo hai thành phần mới gọi là
ViewListComponent
vàAddListComponent
- 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- 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ủ
- 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 AppModulecủ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ảngprovider
. Chúng tôi cũng cần phải nhập khẩuFormsModule
và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.
ở trên cùng, tiếp theo là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
vàViewList
để xây dựng logic của chúng ta. Chúng tôi sẽ làm tổ trong AppComponentcủa chúng tôi như mô tả trong hình dưới đây.
![]()
Bây giờ chúng ta có một thứ bậc các thành phần - AppComponent
ViewListComponent
và sau đó làAddListComponent
./ * ứng dụng. thành phần. html * /
{{chức vụ}}! h1> app-view-list>
/ * xem danh sách. thành phần. html * / <ứng dụng bổ sung danh sách> app-add-list>
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 choDanh 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:
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.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
vàđă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.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 deleteListcủ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ứcloadLists
để 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}} td>
{{list. title}} td> {{list. description}} td>