MEAN.JS - Xây dựng SPA: Cấp độ tiếp theo

Trong chương trước, chúng ta đã thấy việc tạo ứng dụng meanjs trang đơn bằng Angularjs. Trong chương này, chúng ta hãy xem cách ứng dụng Angular sử dụng API để lấy dữ liệu từ Mongodb.

Bạn có thể tải xuống mã nguồn cho ứng dụng này trong liên kết này . Tải xuống tệp zip; giải nén nó trong hệ thống của bạn.

Cấu trúc thư mục của mã nguồn của chúng tôi như sau:

mean-demo
   -app
      -models
         -student.js
   -config
      -db.js
   -public
      -js
         -controllers
            -MainCtrl.js
            -StudentCtrl.js
         -services
            -StudentService.js
         -app.js
         -appRoutes.js
      -views
         -home.html
         -student.html
      -index.html
   -.bowerrc
   -bower.json
   -package.json
   -server.js

Trong ứng dụng này, chúng tôi đã tạo một dạng xem (home.html), dạng này sẽ liệt kê tất cả sinh viên từ bộ sưu tập Sinh viên, cho phép chúng ta tạo một studentghi lại và cho phép chúng tôi xóa hồ sơ học sinh. Tất cả các hoạt động này được thực hiện thông qua lệnh gọi API REST.

Mở thiết bị đầu cuối và chạy lệnh dưới đây để cài đặt các phụ thuộc mô-đun npm.

$ npm install

Tiếp theo, cài đặt các thành phần Bower bằng cách sử dụng lệnh dưới đây. Bạn có thể thấy bower pull trong tất cả các tệp trong public / libs.

$ bower install

Cấu hình nút cho một ứng dụng sẽ được lưu trong tệp server.js. Đây là tệp chính của ứng dụng nút và sẽ cấu hình toàn bộ ứng dụng.

// modules =================================================
const express = require('express');
const app = express();
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var methodOverride = require('method-override');
// set our port
const port = 3000;
// configuration ===========================================
// configure body parser
app.use(bodyParser.json()); // parse application/json

// parse application/vnd.api+json as json
app.use(bodyParser.json({ type: 'application/vnd.api+json' }));

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

// override with the X-HTTP-Method-Override header in the request.
app.use(methodOverride('X-HTTP-Method-Override')); simulate DELETE/PUT

// set the static files location /public/img will be /img for users
app.use(express.static(__dirname + '/public'));

// config files
var db = require('./config/db');
console.log("connecting--",db);
mongoose.connect(db.url); //Mongoose connection created

// grab the student model
var Student = require('./app/models/student');
function getStudents(res) {
   Student.find(function (err, students) {
      // if there is an error retrieving, send the error. nothing after res.send(err) will execute
         if (err) {
            res.send(err);
         }
         res.json(students); // return all todos in JSON format
      });
   };
app.get('/api/studentslist', function(req, res) {
   getStudents(res);
});
app.post('/api/students/send', function (req, res) {
   var student = new Student(); // create a new instance of the student model
   student.name = req.body.name; // set the student name (comes from the request)
   student.save(function(err) {
      if (err)
         res.send(err);
         getStudents(res);
   });
});
app.delete('/api/students/:student_id', function (req, res) {
   Student.remove({
      _id: req.params.student_id
      }, function(err, bear) {
         if (err)
            res.send(err);
         getStudents(res);
      });
});
// startup our app at http://localhost:3000
app.listen(port, () ⇒ console.log(`Example app listening on port ${port}!`));

Xác định lộ trình giao diện người dùng

Tệp public / index.html sẽ có đoạn mã sau:

<!doctype html>
<html lang="en">
   <head>
      <meta charset="UTF-8">
      <base href="/">
      <title>Tutorialspoint Node and Angular</title>
      
      <!-- CSS -->
      <link rel="stylesheet" href="libs/bootstrap/dist/css/bootstrap.min.css">
      <link rel="stylesheet" href="css/style.css"> <!-- custom styles -->
      
      <!-- JS -->
      <script src="libs/angular/angular.min.js"></script>
      <script src="libs/angular-route/angular-route.min.js"></script>
      
      <!-- ANGULAR CUSTOM -->
      <script src="js/controllers/MainCtrl.js"></script>
      <script src="js/controllers/StudentCtrl.js"></script>
      <script src="js/services/StudentService.js"></script>
      <script src="js/appRoutes.js"></script>
      <script src="js/app.js"></script>
   </head>
   <body ng-app="sampleApp" ng-controller="MainController">
      <div class="container">
         <!-- HEADER -->
         <nav class="navbar navbar-inverse">
            <div class="navbar-header">
               <a class="navbar-brand" href="/">Tutorial</a>
            </div>
            <ul class="nav navbar-nav">
               <li><a href="/students">Students</a></li>
            </ul>
         </nav>
         
         <!-- ANGULAR DYNAMIC CONTENT -->
         <div ng-view></div>
      </div>
   </body>
</html>

Chúng tôi đã viết một dịch vụ để thực hiện các lệnh gọi API và thực thi các yêu cầu API. Dịch vụ của chúng tôi, StudentService trông như dưới đây:

angular.module('StudentService', [])
// super simple service
// each function returns a promise object
.factory('Student', ['$http',function($http) {
   return {
      get : function() {
         return $http.get('/api/students');
      },
      create : function(student) {
         return $http.post('/api/students/send', student);
      },
      delete : function(id) {
         return $http.delete('/api/students/' + id);
      }
   }
}]);

Mã bộ điều khiển (MainCtrl.js) của chúng tôi như dưới đây:

angular.module('MainCtrl', []).controller('MainController',
   ['$scope','$http','Student',function($scope, $http, Student) {
   $scope.formData = {};
   $scope.loading = true;
   $http.get('/api/studentslist').
   then(function(response) {
      $scope.student = response.data;
   });
   // CREATE 
   // when submitting the add form, send the text to the node API
   $scope.createStudent = function() {
      // validate the formData to make sure that something is there
      // if form is empty, nothing will happen
      if ($scope.formData.name != undefined) {
         $scope.loading = true;
         // call the create function from our service (returns a promise object)
         Student.create($scope.formData)
         // if successful creation, call our get function to get all the new Student
         .then(function (response){
            $scope.student = response.data;
            $scope.loading = false;
            $scope.formData = {}
         },    function (error){
         });
      }
   };
   // DELETE
   ==================================================================
   // delete a todo after checking it
   $scope.deleteStudent = function(id) {
      $scope.loading = true;
      Student.delete(id)
      // if successful delete, call our get function to get all the new Student
      .then(function(response) {
         $scope.loading = false;
         new list of Student
      });
   };
}]);

Ứng dụng đang chạy

Điều hướng đến thư mục dự án của bạn và chạy lệnh dưới đây:

$ npm start

Bây giờ điều hướng đến http://localhost:3000 và bạn sẽ nhận được trang như trong hình dưới đây -

Nhập một số văn bản vào hộp văn bản và nhấp vào Addcái nút. Một bản ghi được thêm vào và hiển thị như sau:

Bạn có thể xóa bản ghi bằng cách chọn hộp kiểm.