1.用到的技術點javascript
npm 使用npm來進行下載相應的插件和框架 新建項目的文件目錄 dist src assets css js img details details.html details.js app.js 主模塊,各個從(子)模塊會依賴注入到這裏 index.html 主頁面來進行單頁面開發 gulp 來進行代碼壓縮和優化
2.index.html首頁模塊,用到的技術點css
angular指令html
ng-app 設置ng的管理範圍 ng-app="moviecat"前端
ng-view 路由匹配的內容會在這裏顯示 ng-viewjava
ng-submit submit事件 按enter和button都會觸發的事件node
模塊js的引入npm
順序須要注意,須要依賴關係 json
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>電影展現</title> <link rel="stylesheet" href="assets/css/reset.css"> <link rel="stylesheet" type="text/css" href="assets/css/wap.css"> </head> <!-- 1. 先按照功能劃分模塊. 首頁模塊 正在上映 即將上映 top250模塊 電影詳情 爲每個模塊建立1個文件夾. 用來分別保存每個模塊相關的視圖 控制器. --> <body ng-app="moviecat"> <!-- 頂部導航欄開始 --> <div class="top"> <div class="header" ng-controller="searchCtrl"> <a href="#/home_page"><img src="assets/img/logo.png" alt=""></a> <div class="search"> <form ng-submit="query()"> <input class="my-input" type="text" placeholder="電影搜索" ng-model="keyword"> <button>搜索</button> </form> </div> </div> <nav class="nav"> <ul> <!--li中添加 active 類樣式,顯示焦點狀態。--> <li class="active" hm-active><a href="#/home">首頁</a></li> <li hm-active><a href="#/in_theaters">正在熱映</a></li> <li hm-active><a href="#/coming_soon">即將上映</a></li> <li hm-active><a href="#/top250">Top250</a></li> </ul> </nav> </div> <!-- 頂部導航欄結束 --> <!--視圖部分,理由改變從新渲染部分--> <div class="container" ng-view> </div> <footer class="footer"> <div class="container"> <p>版權全部© 前端與移動開發學院 火騎士空空</p> </div> </footer> <script src="assets/js/prefixfree.min.js"></script> <script src="../node_modules/angular/angular.min.js"></script> <script src="../node_modules/angular-route/angular-route.min.js"></script> <script src="./service/heima.js"></script> <script src="./home/home.js"></script> <script src="./in_theaters/in_theaters.js"></script> <script src="./details/details.js"></script> <script src="./coming_soon/coming_soon.js"></script> <script src="./top250/top250.js"></script> <script src="app.js"></script> </body> </html>
3.app.js是主模塊,各個從(子)模塊依賴到這裏來gulp
1.使用一個自執行函數把全局變量angular傳到函數裏面api
(function(angular){處理業務邏輯})(angular)
2.建立angular模塊並起一個名字 跟ng-app="moviecat" 裏的值是同樣的
var app = angular.module("moviecat",["從模塊名稱"])
3.動態獲取表單的值
視圖中 <input class="my-input" type="text" placeholder="電影搜索" ng-model="keyword">
控制器中 $scope.keyword
4.
(function (angular) { //主模塊. //用來管理ng-app的那個模塊就叫作主模塊. //在主模塊中寫的代碼就會直接在html頁面上=起做用. //從模塊若是須要起做用,除非被主模塊依賴. var app = angular.module("moviecat", [ "moviecat_home", "moviecat_details", "moviecat_movie_list", "heima" ]); app.controller("searchCtrl",["$scope","$window",function($scope,$window){ $scope.query = function(){ //將url地址欄的路由改爲/ // #/search?q=china $window.location.hash = "#/search/q="+$scope.keyword; } }]); })(angular);
4.movie_list.js是幾個模塊結合起來的,用到的功能是
1.建立module模塊,並增長模塊依賴 ngRoute heima
2.配置路由 須要angular的路由模塊的 $routeProvider 方法調用when()方法
路由匹配 "/:type/:page?" 前面 ":"是動態匹配後面的?是有路由就匹配,沒有路由匹配能夠忽略
經過templateUrl:"./movie_list/movie_list.html"與html創建聯繫
經過controller:"movie_listController"進行與控制器創建聯繫
3.服務功能介紹
$scope 服務是存放數據的,能夠到html文件中的
$scope.data="石順麟"
$scope.getPage=function(pageIndex){出來業務邏輯} 在視圖中 ng-click="getPage(pageIndex)"
$scope.$apply() 通知視圖數據已經發生更改,趕忙刷新頁面
$routeParams 服務獲取路由動態的值
$window 服務相似全局變量window,
$route 服務是一個路由
$route.updateParams({page:pageindex}) 更改路由參數的值
(function(angular){ //1.建立1個正在熱映的模塊. var app = angular.module("moviecat_movie_list",["ngRoute","heima"]); //2.配置路由 app.config(["$routeProvider",function($routeProvider){ // /in_theaters // #/in_theaters/3 // #/coming_soon/2 // #/top250/4 // #/details/26270502 // #/search?q=china $routeProvider.when("/:type/:page?",{ templateUrl:"./movie_list/movie_list.html", controller:"movie_listController" }); }]); app.controller("movie_listController",["$scope","$routeParams","$route","$window","heimaJsonp",function($scope,$routeParams,$route,$window,heimaJsonp){ $scope.isShow = true; //每一頁的容量 $scope.pageSize = 10; //當前此次要請求第幾頁的數據. $scope.pageIndex = ($routeParams.page || "1" ) - 0; /* pageIndex start 1 0 2 10 = (pageIndex-1)*pageSize 3 20 4 30 5 40 */ heimaJsonp.jsonp({ url:"http://api.douban.com/v2/movie/"+$routeParams.type, //http://api.douban.com/v2/movie/search?q=china&count=20&strat=0 params:{ count:$scope.pageSize,//20 start:($scope.pageIndex-1)*$scope.pageSize,//0 q:$routeParams.q //http://api.douban.com/v2/movie/in_theaters?count=10&start=10&q=undefine }, callback:function(data){ $scope.movies = data; console.log(data); //總頁數. $scope.pageCount = $window.Math.ceil((data.total/$scope.pageSize)); $scope.isShow = false; $scope.$apply();//通知視圖數據模型已經發生變化.趕忙刷新視圖. } }); //請求指定頁碼的數據. $scope.getPage = function(pageIndex){ //2 $route.updateParams({ page: pageIndex }); //先判斷頁碼是否合法. //10 1 10 0 5 //>0 && <= 總頁碼 if(pageIndex < 1 || pageIndex > $scope.pageCount) return; $route.updateParams({ page:pageIndex }); }; /* 1. 實現分頁 1.1 如何向api發送分頁的請求. 參數1: count 表明但願服務器返回的電影的數量. 參數2: start 從第幾部開始給. count=5&start=10 1.2 頁碼經過路由參數來傳遞 修改路由的匹配規則. /in_theaters/:page 在控制器中就能夠拿到page參數. 就能夠根據頁碼和頁容量發起請求. 1.3 上一頁和下一頁的切換. 調用同1個方法 getPage(pageIndex+1) 咱們經過$route服務 updateParams方法修改路由參數. {page:3} */ }]); })(angular);
5.自定義跨域服務
1.建立一個模塊,模塊裏面新建一個自定義服務,服務裏面有一個jsonp函數
2.jsonp裏面思路是拼接url並隨機生成函數名,建立script標籤並給src賦值,並追加到body標籤中
3.調用本身的自定義的服務看上面
先在angular.module()模塊引入,在app.controller()中注入裏面的服務,調用服務裏面的jsonp函數
(function(angular){ var app = angular.module("heima",[]); app.service("heimaJsonp",["$window",function($window){ this.jsonp = function(opts){ //1 拼接url var url = opts.url += "?"; for(var key in opts.params){ url += (key + "=" + opts.params[key] + "&"); } // 生成隨機的函數名 // Math var callbackName = "jsonp_"+ $window.Math.random().toString().slice(2); $window[callbackName] = opts.callback; url += "callback="+callbackName //2.建立script標籤. var script = $window.document.createElement("script"); script.src = url; $window.document.body.appendChild(script); } }]); app.directive("hmActive",[function(){ return { restrict:"A", link:function(scope,elemnt,attrs){ elemnt.on("click",function(){ elemnt.parent().children().removeClass("active"); elemnt.addClass("active"); }); } }; }]); })(angular);
6.經過gulp打包工具壓縮代碼,清除註釋
1.使用node下載相應的第三方包
下載gulp npm install gulp --save
下載壓縮css npm install gulp-cssmin --save
下載壓縮js npm install gulp-uglify --save
下載合併js npm install gulp-concat --save
下載壓縮html npm install gulp-htmlmin --save
2.引入下載的第三方包,經過require()方法來引入
3.建立任務壓縮css代碼
gulp.task("yscss",function(){gupl.src(想壓縮文件).pipe(引入的js函數).pipe(gulp.dest(壓縮到哪裏))})
在cmd中運行gulp gulp yscss 來進行壓縮css代碼
//1. 引入gulp var gulp = require("gulp"); //2. 引入壓縮css的模塊. var cssmin = require("gulp-cssmin"); var uglify = require("gulp-uglify"); var concat = require("gulp-concat"); var htmlmin = require("gulp-htmlmin"); //2.建立任務. gulp.task("testTask", function () { console.log("這是1個新的任務!"); }); //3.建立任務 壓縮css代碼 gulp.task("yscss", function () { gulp.src("./src/**/*.css") .pipe(cssmin()) .pipe(gulp.dest("./dist")); }); //4.壓縮js代碼 gulp.task("ysjs", function () { gulp.src(["./dist/assets/js/all.js"]) .pipe(uglify()) .pipe(gulp.dest("./dist/assets/js")); }) //5. 壓縮html gulp.task("yshtml", function () { gulp.src("./src/**/*.html") .pipe(htmlmin({ removeEmptyAttributes: true, collapseWhitespace: true, removeComments: true, })) .pipe(gulp.dest("./dist")); });