本篇體驗使用AngularJS中的$http對MongoLab資料表進行增刪改查。
主頁面:
<button ng-click="loadCourse()">Load Course</button> <button ng-click="toggleAddCourse(true)">Add New Course</button> <ng-includce src="'course_list.html'"></ng-include> <ng-include src="'add_course.html'" ng-show="toggleAddCourseView"></ng-include> <ng-include src="'edit_course.html'" ng-show="toggleEditCourseView"></ng-include>
以上,頁面上顯示course_list.html,add_course.html和edit_course.html的內容顯示與toggleAddCourseView和toggleEditCourseView值有關,而toggleAddCourseView和toggleEditCourseView值將通過方法來控制。
■ 在Mongolab上建立資料庫和表
→ https://mongolab.com
→ 註冊
→ 登入
→ Create new
→ 選擇Single-node
勾選Sandbox,輸入Database name的名稱為myacademy。
→ 點選新建立的Database
→ 點選Add collection
名稱為course
→ 點選course這個collection。
→ 多次點選add document,新增多條資料
■ 控制器
$scope.courses = []; var url = "https://api.mongolab.com/api/1/databases/my-academy/collections/course?apiKey=myAPIKey"; var config = {params: {apiKey: "..."}}; $scope.toggleAddCourseNew = false; $scope.toggleEditCourseView = false; //列表 $scope.loadCourses = function(){ $http.get(url, config) .success(function(data){ $scope.courses = data; }); } //新增 $scope.addCourse = function(course){ $http.post(url, course, config) .success(function(data){ $scope.loadCourses(); }) } //顯示修改 $scope.editCourse = function(course){ $scope.toggleEditCourseView = true; $scope.courseToEdit = angular.copy(course); } //修改 $scope.updateCourse = function(courseToEdit){ var id = courseToEdit._id.$oid; $http.put(url + "/" + id, courseToEdit, config) .success(fucntion(data){ $scope.loadCourses(); }) } //刪除 $scope.delteCourse = function(course){ var id = course._id.$oid; $http.delete(url+ "/" + id, config) .success(function(data){ $scope.loadCourses(); }) } $scope.toggleAddCourse = function(flag){ $scope.toggleAddCourseView = flag; } $scope.toggleEditCourse = fucntion(flag){ $scope.toggleEditCourseView = flag; }
■ course_list.html 列表
... <tr ng-repeat="course in courses"> <td>{{$index+1}}</td> <td>{{course.name}}</td> <td>{{course.category}}</td> <td>{{course.timeline}}</td> <td>{{course.price | currency}}</td> <td><button ng-click="editCourse(course)">Edit</button></td> <td><button ng-click="deleteCourse(course)">Delete</button></td> </tr>
■ add_course.html 新增
<form> <input type="text" ng-model = "course.name" /> <select ng-model="course.category"> <option>-Select-</option> <option value="development">Development</option> <option value="business">Business</option> </select> <input type="number" ng-model="course.timeline" /> <input type="number" ng-model="course.price"/> <button ng-click="addCourse(course)">Add</button> <button ng-click="toggleAddCourse(false)">Cancel</button> </form>
■ edit_course.html 更新
<form> <input type="text" ng-model="courseToEdit.name" /> <select ng-model ="courseToEdit.category"> <option>-select-</option> <option value="development">Development</option> <option value="business">Business</option> </select> <input type="number" ng-model="courseToEdit.timeline"/> <input type="number" ng-model="courseToEdit.price"/> <button ng-click="updateCourse(courseToEdit)">Update</button> <button ng-click="toggleEditCourse(false)">Cancel</button> </form>
當然還可以通過factory的方式建立一個服務,把有關增刪改查的邏輯封裝在裡面。
myApp.factory("courseDataService", function($http, $q){ return { getCourses: function(){ var deferred = $q.defer; $http.get(url, config) .success(function(data){ defered.resolve(data); }) .error(function(error){ deferred.reject(error); }) return deferred.promise; }, addCourse: function(course){ var deferred = $q.defer(); $http.post(url, course, config) .success(function(data){ deferred.resolve(data); }) .error(function(error){ deferred.reject(error); }); return defered.promise; } } })
然後在controller中按如下引用:
myApp.controller("AppCtrl", function($scope, $http, courseDataService){ ... $scope.loadCourses = courseDataService.getCourses() .then(success, error); function success(data){ $scope.courses = data; } function error(e){ console.log("error:", e); } $scope.addCourse = function(course){ courseDataService.addCourse(course).then( function(data){ $scope.loadCourses(); }, function(e){ console.log("error:" + e); } ); } })