7_nodejs angularjs

 

 

webstrom使用:javascript

ctrl+b/點擊,代碼導航,自動跳轉到定義php

ctrl+n跳轉指定類css

ctrl+d複製當前行ctrl+enter另起一行ctrl+y刪除當前行html

ctrl+alt/shift+b跳轉方法實現/定義處java

包裹/去掉外圍代碼unwrap...node

主題appearancemysql

字體editor-colors&fonts-fontjquery

自動換行settings-editor-appearance-show linegit

顯示行號..........................show line numbersgithub

代碼對齊..........................show right margin

代碼提示速度...editor-code completion,autopopup in(ms):0

代碼拼寫檢查設置

ctrl+e打開最近文件

代碼補全settings-javascript-libraries-down/xxx.ts定義文件定位

git配置:editor-github改github帳戶

插件安裝file-plugins   css-X-fire插件:firebug修改css屬性時,編輯器內的css代碼也會發生變化

禁用部分插件提升打開速度

webstrom配置nodejs:

settings-->languages....-->nodejs....-->選擇文件exe;配置source code:directory;c:\.....\npm

 

 

Node.js:

js運行在瀏覽器/客戶端的語言,主要對象包括ES原生對象(11個)、BOM對象、DOM對象

node.js運行於服務器端,相似於php,jsp,asp.net;主要對象包括:es對象、1000+擴展對象;能夠編寫獨立的服務器應用/向web發送數據;基於服務器和客戶端的v8引擎,訪問服務器端文件系統/數據庫

node.js與php+Nginx性能對比:node.js每秒響應請求數較多(輸出/執行mysql查詢)

LTS: Long Term Support               下載:https://nodejs.org

npm全局模塊存放路徑;cache緩存路徑

,一個

Node.js 文件就是一個模塊,這個文件多是 JavaScript 代碼、JSON 或者編譯過的 C/C++ 擴展。

Node.js 特色:異步式 I/O(或者非阻塞 I/O)與事件緊密結合的編程模式;

控制流很大程度上要靠事件和回調函數來組織

 

①node兩種運行模式:

交互模式:REPL模式,cmd:node

腳本模式:node xxx.js絕對路徑或cmd:e:-->cd 文件夾-->node 文件名

node -v查看版本

②調試:命令行調試:cmd:node debug debug.js,

單擊行號添加斷點

③nodejs HTTP模塊:內部是用 C++ 實現的,外部用 JavaScript 封裝

HTTP協議的內容:nodejs需手動設置http協議,php一般不須要設置http協議

  (1)請求消息

       GET /web/index_new.html?tedu HTTP/1.1

Host: tmooc.cn

Connection: keep-alive

  (2)響應消息

       HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Type: text/html;charset=UTF-8

QueryString模塊:用於解析鍵值對形式的查詢字符串,獲得一個對象。

HTTP 協議規定,請求消息能夠在URL後面追加一個?開頭的QueryString,用於向服務器提交請求數據。

var qs=require("querystring");     //引入指定模塊

var str = 'uname=tom&upwd=123&age=20';

var obj=qs.parse(str);                  //將str解析爲對象

URL模塊:解析一個完整的URL地址,獲得其中的各個部分

var url=require("url");

var str="http://tedu.cn:80/s.do?k1=v1&k2=v2";

var obj=url.parse(str,true);              //true表示使用

手動解析?後內容,得到表單數據,get請求在url上返回數據

FileSystem模塊:用於操做文件系統,讀寫目錄、讀寫文件,Node.js底層使用C程序來實現

              var fs = require('fs');

              var data = fs.readFileSync('源文件名',['utf-8'],[f(err,data)]);   //同步讀取文件內容到緩衝區

fs.readFile(file,['utf-8'],[f(err,data)])          //異步讀取文件

              fs.writeFileSync('目標文件名', '要寫出的內容');            //向文件中寫出內容

              fs.appendFileSync('目標文件名', '要追加的內容');  //向文件中追加內容

 

④nodejs第三方模塊:https://www.npmjs.com/全世界最大的node.js第三方模塊集散地

第三方模塊js必須保存在js同級目錄下的名爲node_modules的文件夾中

MySQL模塊:npm

var mysql=require("mysql");

var coon=mysql.createConnection({

host        :             '127.0.0.1',

       user        :             'root',

       password :             '',

       database :             'tedu'

});

conn.query('INSERT/SELECT...',f(err,result){});

conn.end();

 

⑤建立一個靜態Web服務器:

步驟:

建立一個HTTP Server

爲server指定處理請求消息的過程(獲取請求數據,返回響應數據,http、url、fs模塊)

解析請求URL中的資源名稱, 如 /login.html

       讀取指定文件中的內容,如 htdocs/login.html

       構建響應消息,把讀取到的文件內容輸出客戶端客戶端

讓server開始監聽特定端口

var http = require('http');

var server = new http.Server();

server.on(事件, f(){             //解析url,讀取html文件 });

server.listen(端口號);

事件:

request:f返回http.ServerRequest請求對象,http.ServerResponse響應對象參數

req請求對象:

req.url:請求文件的url,做爲url字符串使用

req.data(chunk):請求體數據到來時被觸發,chunk請求體數據,

所有數據:datas+=chunk;該事件會屢次調用

用於表單的post請求,post請求在請求體中返回數據

req.end():請求體數據傳輸完成觸發

req.close():請求結束觸發,包括用戶強制終止傳輸

res響應對象:輸出到客戶端

res.writeHead(status,[headers]):向客戶端發送請求頭,status狀態碼

res.write(data,[encoding]):發送響應內容,data內容,encoding編碼方式

res.end([data],[encoding]):結束相應,不調用則客戶端永遠處於等待狀態

connection:TCP鏈接創建被觸發

close:服務器關閉時觸發,不包括用戶鏈接斷開

修改代碼後必須終止Node.js 再從新運行纔會奏效(不能刷新)

ex:啓動服務器並開始監聽3000端口:

var http = require('http');

var server=http.createServer(function(req, res) {            //http.createServer()建立http.Server服務器對象

res.writeHead(200, {'Content-Type': 'text/html'});   //請求成功的響應代碼200

res.write('<h1>Node.js</h1>');                         //返回響應體

res.end('<p>Hello World</p>');

}).listen(3000);                                                      //鏈式,

console.log("HTTP server is listening at port 3000.");//進程一直等待,直到按下ctrl+c退出

打開瀏覽器訪問 http://176.2.18.39:3000

 

⑥建立一個動態Web服務器:

解析url資源:xxx.html或xxx.do

爲Server指定處理請求消息的過程

若請求資源名稱以.html結尾,直接讀取指定文件中的內容,如 htdocs/login.html,做爲響應消息數據;

若請求資源爲xxx.do,解析請求數據,訪問數據庫,把執行結果做爲相應消息數據

構建響應消息,把讀取到的文件內容輸出客戶端客戶端

讓Server開始監聽特定端口

 

⑦共享80端口:虛擬主機,就是讓多個網站共享使用同一服務器同一IP地址,經過域名的不一樣來劃分請

求;在Nginx 中設置反向代理和虛擬主機很是簡單,下面是配置文件的一個示例:

server {

listen 80;

server_name mysite.com;

location / {

proxy_pass http://localhost:3000;

}

}

這個配置文件的功能是監聽訪問mysite.com 80 端口的請求,並將全部的請求轉發給

http://localhost:3000,即咱們的Node.js 服務器。如今訪問http://mysite.com/,就至關於服務器

訪問http://localhost:3000了。

在添加了虛擬主機之後,還能夠在Nginx配置文件中添加訪問靜態文件的規則(具體請

參考Nginx文檔),刪去app.js 中的app.use(express.static(__dirname + '/public'));。

這樣能夠直接讓Nginx 來處理靜態文件,減小反向代理以及Node.js 的開銷。

 

 

 

 

 

MVC架構:設計模式之一,

Model:模型,項目中的數據;

View:視圖,數據的呈現;

Controller:控制器,獲取模型數據,選擇視圖加以呈現

模板爲中心的架構:PHP、ASP、JSP

AngularJS:js框架

致力於開發單頁面應用程序(Single Page Application)

易於構建頁面CRUB操做

一切操做都以數據爲中心:建立/綁定/修改/更新數據;基本思路與jQuery的先查找元素再操做元素不一樣

AngularJS四大特性:採用MVC模型,雙向數據綁定,依賴注入(DI),模塊化設計

使用:

引入js文件:angular.js;<script src="js/angular.js"></scropt>

爲父級元素聲明ng-app屬性;

在父級元素內部使用AngularJS:<p>{{1+2}}</p>

 

AngularJS的MVC:

ng-controller聲明模型數據:

<html ng-app="myapp">                   //定義模塊名並肯定模塊做用範圍

<div ng-controller="myctrl">            //控制器組件

<p>{{num}}</p>               //綁定數據

</div>

 <button ng-click="add($index)">loadMore</button>           //傳入參數

</html>

var app = angular.module('myapp',[]);              //聲明模塊

//一個模塊能夠定義多個功能組件:controller,directive,filter,service,...

app.controller("myctrl",function($scope){ //聲明控制器

console.log($scope);

$scope.num=10;                               //定義模型數據,存在$scope對象中

$scope.add=function(){...}                //定義模型函數

})

或angular.module('模塊名',[依賴列表]).controller("控制器",function($s){s.xxx;});

     

 

雙向數據綁定:

Model數據綁定到View:髒數據檢查(Dirty Checking):model數據的修改自動更新到View

①{{表達式}}:

+ - * / % > >= == === !== && || ! ?:  {{20>18?1:0}}

不容許:1++,1--;1+=2;

特殊運算符:typeof(num),age instanceof String;

new和var關鍵字

{{{'ename':'tom'}.ename}}獲取對象的成員屬性 member={ename:'tom'}

{{member.ename}}

{{'hello'.toUpperCase()}}獲取對象的成員方法

{{['tom','mary'][1]}}獲取數組中的指定元素

②指令directive:標籤內添加屬性,封裝DOM操做

ng-app[="模塊名"]                     初始化一個AngularJS應用程序,肯定一個應用模塊的做用範圍;

ng-init="表達式"                聲明/賦值變量,不推薦,變量可賦值值/數字/對象{},雙向綁定

x1=val;x2=val;      car={name:'BMW',price:'30'}

ng-bind="表達式"               表達式的值輸出爲當前元素的innerHTML;將模型變量綁定到視圖中

{{...}}去輸出表達式結果時,有可能會出現閃爍,ng-bind代替輸出防止閃爍

ng-repeat="v in arr/obj"              循環生成當前元素,爲HTML增長循環功能

<li ng-repeat="tmp in arr/obj">{{tmp}}</li>          tmp下標,經常使用{{arr.tmp/tmp.xxx}}

ng-repeat="dish in list track by $index"

ng-repeat="(k,v) in arr/obj"        

<li ng-repeat="(k,v) in car">{{k}} {{v}}</li>  arr:k下標;obj:循環輸出鍵值對key,value          

ng-if="表達式"            表達式爲true,當前元素會掛到DOM,不然刪除

<tr ng-repeat="tmp in stuList" ng-if="tmp.chinese > 60">{{tmp}}</tr>知足ng-if時循環輸出tmp

ng-include="'tpl/footer.html'"            替換某標籤內片斷,如footer     

ng-controller="控制器"              每一個控制器有一個$scope做用域對象,可嵌套

控制器應該儘量保持短小精悍,而在控制器中進行DOM操做和數據操做則是一個很差的實踐。

<ANY  ng-xx=''/>              xx:html標籤的擴展屬性

ng-click="f()"

ng-src="img/{{url}}"          <img ng-src="img/{{dish.url}}" alt=""/>

err-src="img/404.jpg"   若圖片加載失敗,404報錯時,提供備用圖片

ng-herf=「...」

<ngView />擴展標籤

ng-show/hide="isshow"              ngShow表達式計算結果爲假時,ng-hide CSS 類會被加到元素的class屬性中

      <p ng-show='hasMore' ng-click="add()">添加更多按鈕</p>

       <p ng-hide="hasMore">沒有更多數據能夠加載了</p>

ng-style/class

ng-checked

ng-disabled

ng-model=」val」                 綁定input,select,texttarea;¥scope.val=...;

 

View數據綁定到Model:View數據的修改自動更新到Model

①ng-model="模型變量名"        只有表單控件的值能夠修改:input,多行文本textarea,下拉框select,單選複選

<input type="checkbox" ng-model="isAgree">

<button ng-disabled="!isAgree">111</button>

$scope.$watch('agree',function(){console.log($scope.agree);})      使用$scope.$watch()監視到模型數據的每次修改

 

 

過濾器filter:對錶達結果進行篩選/格式化;| 管道,用於數據傳遞

{{ 表達式 | filter[:params] | filter2[:params] }}

number:小數部分有效位數               格式化數字,若不是數字則返回空字符串

currency:'貨幣符號'                          格式化爲貨幣形式$

{{sum()|currency:'¥'}}                    sum():return value;

date:'日期時間格式'                          把date/string/number轉換爲特定的日期格式

{{nowDate | date:'yy-MM-dd'}} $scope.nowDate = new Date();

upperCase                                         全部字符轉換爲大寫

lowerCase                                         小寫

orderBy:表達式                                對數組進行排序,默認增序,true降序,

 <li ng-repeat="tmp in friends|orderBy:'age'[:true | limitTo:3]>{{tmp.name}} {{tmp.age}}</li>只顯示前三名

limitTo:n                                                 返回指定長度

 

 

函數function:

angular.uppercase(string);                               大寫轉換

angular.lowercase(string);                                小寫

angular.fromJson(jsonStr);                              反序列化

angular.toJson(obj, [pretty]);                                  序列化,json->str

angular.forEach(obj/arr, fn(value,key), [context]);   對obj/arr的每一個條目調用一次fn

angular.module(name, [requires], [configFn]); 建立模塊,angular.module('app',['ng'/依賴列表])     

 

 

服務service:每一個service對象都是單例的

經常使用內置服務/注入對象:

$scope:        做用域對象,子$scope若找不到值則訪問父$scope,直到$rootScope中也找不到

$scope.$watch("模型變量名",function(to,from){....},[false/true]);              監聽模型數據變化,

每次進行model到view的綁定都會建立一個$watch追加到$watch隊列中

$scope.$digest()                                手工觸發$watch隊列中的全部監聽函數,

$scope.$apply(function(){...})           對$scope.$digest()的進一步封裝,建議使用$apply方法完成$digest的調用

angular上下文環境中對模型修改自動調用;若在上下文環境以外被修改需手工調用

$scope.$apply();<==> $rootScope.$digest();

$location:

controller(控制器名,function($scope,$location){    //使用某個服務則需在控制器的回調函數中注入進來

console.log($location.absUrl());         //獲取地址

});

$http:能夠向服務器發起ajax請求,異步的獲取服務器端返回的相應數據,默認json數據

$http({method:"GET/POST",url:"/url"})   請求地址:data/test.json或php

.success(function(data, status, headers, config){})

.error(function(data, status, headers, config){});

$http.get("/url").success(fn(data,...));               傳數據url+?k=v

$http.post("/url",data).success(fn);

$http.head

$http.put

$http.delete

$http.jsonp

$rootScope                  根做用域對象,所用的控制器實例共用,用於跨控制器共享模型數據

module.controller('控制器名',function($rootScope){$rootScope.模型變量=值;$rootScope.模型方法=fn;})

$window:提供對於瀏覽器的 window 對象的包裝引用。

$animate:實現動畫

$log

$interval:週期性定時器

$scope.timer=$interval(function(){

})

終止定時器$interval.cancel($scope.timer);

<==>setInterval($scope.f(),1000)

$timeout:一次性定時器

$timeout(function(){...},1000);

<==>setTimeout(fn,time)

 

依賴注入(Dependency Injection):$injector注入器快速定位到須要注入的各類服務

①推斷式依賴注入:不須要關注注入時參數的前後順序,ng會根據參數查找對應的服務並注入進來,這種方式不能處理壓縮或者混淆後的代碼,只能處理原始的代碼

自定義服務

app.factory('服務名字',function(){

return {

方法名:function(){},

屬性名:屬性值

};

});

app.controller('MyCtrl',function($scope,$show){$service.方法()/屬性}

②標記式依賴注入:直接調用$inject屬性來完成(字符型數組)

var ctrFunc = function ($scope,$print,$show) {

           $scope.callShow = function () {

               $show.show();

           }

 

           $scope.callPrint = function () {

               $print.print();

           }

};

ctrFunc.$inject = ["$scope","$print","$show"];

app.controller('myCtrl',ctrFunc);

③行內式依賴注入:容許咱們將一個字符數組做爲對象的參數;在這個數組中,除最後一個元素必須是函數體以外,其他都是注入的服務名稱。

app.controller('MyCtrl',["$scope","$show",function($scope,$show){...}])

 

獲得注入器:auto/service

 var injector = angular.injector(['myApp','ng']);

 或app.controller('myCtrl',fn($scope){

$scope.f=function(){

var injector=angular.injector(['myApp','ng']);           //經過注入$injector服務代替angular.injector()

injector.has('$show')...

}

}

injectorAPI:

injector.has('$show'):從註冊列表中查找對應服務,找到返回true

injector.get('$show'):返回指定名稱的服務實例,獲取實例以後,調用服務中的屬性和方法

 

壓縮文件:

YUICompressor:雅虎UI庫,java語言編寫,壓縮css/js文件

刪除全部註釋,無語義的空白字符,將變量名/函數名替換爲儘量短的形式

安裝java運行環境-jdk

經過命令行:java.exe -jar C:\yui-compressor.jar C:\demo03Js.js > C:\demo.min.js

或webstorm配置yuicompressor,監視並自動進行壓縮

file-settings-file watchers-+添加yui-配置jar包路徑

壓縮文件的依賴注入:

壓縮過程會對函數的形參名進行精簡壓縮,則Angular沒法識別,從而沒法實現注入

解決:行內式依賴注入:module.controller('控制器名',['$scope','$http','$log',function($scope,$http,$log){...}])

 

 

模塊化:

b模塊使用a模塊當中的東西,在b模塊聲明的時候,在依賴列表中寫上對應的模塊名字

var app01=angular.module("myApp01",[]);

var app02=angular.module("myApp",['ng','myApp01']);

面試題:一個ng模塊,能夠包含哪些組件:

①controller:多個控制器組件

②directive:指令,view中綁定模型數據

③service:服務,在不一樣控制器之間提供某種函數服務

④filter:過濾,篩選,格式化輸出

⑤function:

provider組件:相似於service,較少使用

type組件:好比

object組件:有些對象,不多用

 

 

 

 

自定義指令

app.directive('指令名'.function(){                                         //駝峯式命名tsHello,使用則ts-hello

return{

restrict:'EAC',                                                        //限制值:E(Element)A(Attribute)C(Class)M(Comment)

template:'該指令實際對應的HTML內容',             //替換標籤內文本

templateUrl:'xxx.html'

};

})

普通標籤使用:<ts-hello></ts-hello>

屬性使用:<p ts-hello></p>

class使用:<p class="ts-hello"></p>

 

建立一個服務:

app.service('服務名',function(){                             //服務名:$xxx

this.xx=xxx;

this.yy=function(){...}

})

factory是普通方法,service是構造函數

 

自定義過濾器:

app.filter('過濾器名',function(){

return function(輸入參數){

//處理過程

return 處理結果

}

})

 

 

SPA(single page application)單頁應用工做原理:

1.url形式:http://127.0.0.1/index.html#/路由地址

2.瀏覽器先拿到index.html,再解析路由地址

3.路由詞典

#/start==>tpl/start.html

#/main

4.獲取到真實頁面地址,發起請求,獲取末班頁面,插入到DOM樹,實現刷新

 

路由模塊:

①建立一個完整html頁面,引入angular.js和angular-route.js

②聲明模塊angular.module('myApp',['ng','ngRoute']);

③html中使用ngView聲明一個容器元素,盛放代碼片斷

④建立模板頁面

⑤配置路由詞典

app.config(function($routeProvider){

$routeProvider.

when('/路由地址1',{                                //頁面url:/start

templateUrl:'模板頁面地址1',           //文檔url:xxx.html,包含片斷如<p>..</p>,無需完整結構

controller:"starCtrl"                                  //聲明控制器

}).when('/路由地址2/:index',{                 //:index變量前加冒號

templateUrl:'模板頁面地址2',

controller:"mainCtrl"                

}).otherwise({

redirectTo:'/路由地址1'                            //默認其餘跳轉url

})

});

模板跳轉:

超連接:<a href="#/路由地址">...</a>

js實現:

<button ng-click="jump()"></button>

$scope.jump=function(){  $location.path("/路由地址");  }

var app = angular.module('myApp',['ng','ngRoute']);

  app.controller('startCtrl',

    ['$scope','$location',

      function ($scope,$location) {

      $scope.jump = function () {

        $location.path('/login');

      }

  }]);

讀取路由參數:

.controller("...",function($routeParams){console.log($routeParams.dno);})

 

動畫模塊ngAnimate

依賴兩種技術:

CSS Transition/Keyframes動畫

聲明ngAnimate依賴模塊後,元素消失/顯現時自動添加的class

.ng-enter:元素消失=>存在時,剛一進入時的狀態

.ng-enter-active:元素消失=>存在時,進入完成時的狀態

.ng-leave:存在=>消失時,剛一離開時的狀態

.ng-leave-active:存在=>消失時,離開完成時的狀態

中間的動畫的執行由css transition實現

經過設置四個class來添加動畫

.page {

    position: absolute;

    width: 100%;

}

.page.ng-enter,

.page.ng-leave {

    -webkit-transition: .5s linear all;

    -moz-transition: .5s linear all;

    -ms-transition: .5s linear all;

    -o-transition: .5s linear all;

    transition: .5s linear all;

}

.page.ng-leave {

    left: 0;

    opacity: 1;

}

.page.ng-leave.ng-leave-active {

    left: -100%;

    opacity: 0;

}

.page.ng-enter {

    left: 100%;

    opacity: 0;

}

.page.ng-enter.ng-enter-active {

    left: 0;

    opacity: 1;

}

jQuery.animate()函數

引入jquery.js,angular.js,angular-animate.js

建立模塊,聲明對ngAnmiate模塊的依賴

var app = angular.module('kaifanla',['ng','ngRoute','ngAnimate']);

app.animation(‘要使用動畫的元素選擇器’,function(){

return{

enter:function(e,fn){

$(e).css({剛一進入時的初始狀態});

$(e).animate({剛入完成時的狀態},2000,fn);

},

leave:function(e,fn){

$(e).css({剛一離開時的初始狀態});

$(e).animate({離開完成時的狀態},2000,fn);

}

}

})

相關文章
相關標籤/搜索