angular中的概念和原理淺析
問題反饋
- MVC 與 MVVM
- M: model 資料模型
- V: view 檢視( 介面 )
- C: controller 控制器
- VM: ViewModel 檢視模型
依賴注入
.controller( ‘….’, [ ‘…’, function ( … ) {
}] )
就是傳參
angular.module( 'mainApp' )
獲得已定義的 模組 mainApp
模組定義到哪裡去了? 定義在 angular 內部.
怎麼藉助於中間的橋樑, 事先安排好的暗號: 此時就是 mainApp, 即模組的名字.
就是說 如果需要得到某一個東西, 首先呼叫對應的方法獲得, 就需要給定你要申請的名字.
angular 會根據的名字將你需要的東西返回給你.
在建立控制器的時候需要使用 $scope
, $log
, $timeout
, $interval
, …
然而這些物件都是 angular 建立的, 因此需要提交申請.
.controler( 'mainController', [ '$scope', '$log', function ( $scope, $log ) {
}] );
所謂的依賴注入:
- 依賴: 需要
- 注入: 傳入
* $scope 作用域
* controller 引數與作用
* 執行原理與基本結構( $watch, $apply )
* $scope和$watch裡面的機制是什麼
* 髒檢查
* 兄弟間傳值( 觀察者模式 )
* on( 'type' ,.. )
* 事件指令
* ng-class
* ng-model和ng-init的區別 為什麼加了init後在指令碼里就不能再修改標籤裡的值了
- 網站開發的發展歷程
- 靜態頁面時代 瀏覽器, 伺服器 特點: 伺服器只是接收請求, 讀取本地靜態資源( html, css, js, png, … ), 傳送這些資源
瀏覽器接收資源, 渲染顯示
- 靜態頁面時代 瀏覽器, 伺服器 特點: 伺服器只是接收請求, 讀取本地靜態資源( html, css, js, png, … ), 傳送這些資源
補充: 伺服器, 網站根目錄的含義
在 伺服器計算機上有一個 資料夾, 這個資料夾放置著頁面的所有檔案
利用 http 軟體, 設定該資料夾為網站根目錄.
由於安全問題, http 設定了網站根目錄後, 那麼只允許訪問該目錄下的所有資源.
不允許訪問其他父級目錄( 除非特殊設定 )
url:
協議://域名或IP:埠號/檔案路徑?引數...
* 動態網站時代 問題: 比如百度搜尋, 不可能將搜尋的頁面設計成靜態頁面. 必須引入動態網站( php ) 特點: 一般 url 都帶有引數( get, post ) 伺服器拿到資料之後檢查如果是 php 請求, 將該請求交給 php 引擎
php 執行程式碼, 拼接 html 格式的字串, 返回給 伺服器
伺服器在將該 html 形式的字串 傳送給瀏覽器
瀏覽器再解析執行渲染顯示.
思想在這裡發展: MVC, …
* 過度階段( 分散式雛形 ) 特點: 伺服器接收請求, 獲得資料, 返回最小的資料, 由瀏覽器來顯示最終的效果( DOM )
* webapi 階段 特點: 伺服器只提供資料, 最終如何顯示由其他結構來決定
典型案例 給定一個 資料, 生成一個 table var data = [ { name: ‘jim1’, age: 19, gender: ‘男’ }, { name: ‘jim2’, age: 9, gender: ‘女’ }, { name: ‘jim3’, age: 29, gender: ‘男’ }, { name: ‘jim4’, age: 39, gender: ‘女’ }, { name: ‘jim5’, age: 49, gender: ‘女’ } ];
傳統的處理辦法( DOM )
改良的傳統辦法( innerHTML )
2.1. 分離的思想早期將 資料, 介面, 邏輯混合在一起開發, 維護的時候就會很麻煩
將資料, 介面, 邏輯分離
MVVM 問題引入- 維護程式碼需要提供互動
- 資料模型的準確性
- 儲存使用者資訊: 性別
- 漢字: GB2312 2 個位元組, unicode 2 個位元組, utf-8 三個位元組
- 一般資料儲存的時候 男使 用 m( male ), 女 使用 f ( female )
var data = [
{ name: ‘jim1’, age: 19, gender: ‘m’ },
{ name: ‘jim2’, age: 9, gender: ‘f’ },
{ name: ‘jim3’, age: 29, gender: ‘m’ },
{ name: ‘jim4’, age: 39, gender: ‘f’ },
{ name: ‘jim5’, age: 49, gender: ‘f’ }
];需要提供一個轉換
電商的例子
- 使用者儲存單獨存放
商品儲存單獨存放
頁面顯示的時候是一起顯示
在實際應用中, 更多的是進行頁面的互動, 而最後一次性向伺服器提交處理
也就是說以前 控制器( 維護檢視與 Model 的橋樑 )功能被弱化. 而增強了
檢視與檢視模型的使用. 因此將其稱為 MVVM
中午反饋- DOM 的含義是 文件物件模型.
123456789- 將 第二個 div 中文字的顏色改成 紅色
- 將整個 頁面 看成一個節點( Node )樹, 任何內容都是節點. 節點與節點之間只有父子關係與兄弟關係
‘get-element-by-id’ => ‘getElementById’
‘get-element-by-id’.replace( /-(.)/g, function ( _, first ) {
return first.toUpperCase();
});
‘getElementById’ => ‘get-element-by-id’
‘AAA’ => ‘a-a-a’
‘getElementById’.replace( /(.)([A-Z])/g, function( _, prev, next ) {
return prev + ‘-’ + next.toLowerCase();
}).replace( /(.)([A-Z])/g, function( _, prev, next ) {
return prev + ‘-’ + next.toLowerCase();
})
- angular- ng 他是一個典型的 mvvm 框架
- 框架與庫的區別
- 如果使用 ng 的步驟
- 引入 angular.js
- 新增 ng-app 屬性
- 新增 ng-xxx 等屬性
- ng 最大的特點就是雙向資料繫結
5.1. 案例:- 要求頁面中提供兩個 文字框, 要求任意在一個文字框中輸入內容, 兩個文字框的資料同步
- 補充:
- 在 ng 中凡是以 ng- 開頭的這些屬性 都稱為 ng 的 指令( directive )
- 所謂的指令就是給 標準的 html 標籤提供一些額外的操作( 額外的功能 )
- 指令不一定都是 以 ng- 開頭, 還有以標籤形式存在的, 以 class 形式存在的, 以 註釋形式存在的
5.2. 文件- http-server
是一個 輕量級的 http 伺服器, 使用的 是 node 平臺( npm )
使用 npm 安裝 http-server
語法: npm install -g http-server –registry=https://registry.npm.taobao.org
安裝好以後可以使用 http-server 或 hs 表示該命令
使用的語法: hs -o -p 8081, 將當前目錄作為 網站的根目錄
5.3. 模組( module )- ng 中, 所有的 頁面不可能將所有的東西都做成屬性, 還需要事件等其他更多的功能
- 如果需要提供點選的行為, 那麼就需要使用 ng-click 的指令
語法: ng-click=”func()”
當使用者點選行為發生的時候, ng 就會自動的呼叫 函式 func()
問題是 這個函式應該在哪? 就在 $rootScope 上
此時需要編寫程式碼
- 如果使用者不寫任何程式碼( 不給 ng-app 來提供名字 ), 那麼 ng 就會自動的維護一個 模組 物件.
- 但是如果需要實現一些複雜的功能 就必須手動的建立模組, 那麼就必須讓我們建立的模組與 介面繫結( 給 ng-app 賦值 )
- 如果使用者給 ng-app 提供了名字, 那麼 ng 就不會再建立 模組來維護程式碼了
建立模組的語法
angular.module( ‘模組名’, [] ) -> 模組物件
該方法會建立一個模組, 並將其命名為 指定的名字
說明:
1> 第二個引數 [] 是用於載入其他模組使用的
2> 如果不提供第二個引數, 那麼就表明是在獲得模組( 以前已經定義 )
在 ng 中 一個 頁面就相當於一個 angular 的應用程式( ng-app ),
在 ng 中 一個頁面預設只允許有一個主模組, 即 ng-app.
如果必須讓一個頁面有多個 ng-app 必須使用手動程式碼繫結( 引導 )
語法: angular.bootstrap( dom元素, [ ‘模組名’ ] )
run 方法在 ng 中 有一個 run 方法, 表示一執行起來的方法, 類似於 window.onload
語法:
.run( [ ‘rootScope′,function( rootScope', function (rootScope ) {
// …
}] );
使用 run 方法一般都是進行初始化, 如果需要有點選的行為 那麼就給 $rootScope 提供方法即可控制器
與傳統 mvc 中的 控制器不一樣. ng 的控制器用於劃分邏輯, 與初始化資料
在頁面中定義多個 控制器, 可以將全域性rootScoep解放出來.每一個控制器背後依舊會有一個 rootScoep 解放出來. 每一個 控制器背後依舊會有一個scope
每一個控制器單獨維護一個具體的任務.
使用步驟:
1> 在模組中要建立控制器
2> 在 頁面中使用 ng-controller 指令, 註明使用哪一個控制器
3> 在 控制器中寫初始化程式碼
相關文章
- 淺析DHCP的概念和原理(中科三方)
- Angular @Injectable 註解的工作原理淺析Angular
- Angular @Inject 註解的實際應用例子和工作原理淺析Angular
- 淺析InnoDB引擎的索引和索引原理索引
- .NET6中的await原理淺析AI
- koa原理淺析
- BTrace 原理淺析
- Seata原理淺析
- 淺析Promise原理Promise
- AQS原理淺析AQS
- Webpack 原理淺析Web
- InheritedWidget原理淺析
- 淺析DES原理
- 淺析VO、DTO、DO、PO的概念、區別和用處
- webpack系列--淺析webpack的原理Web
- markdown-it 原理淺析
- 淺析Spring中AOP的實現原理——動態代理Spring
- 淺析MyBatis的動態代理原理MyBatis
- 淺析反向代理的原理與作用
- 淺析volatile原理及其使用
- redux-saga 原理淺析Redux
- react-loadable原理淺析React
- Vuex 原理淺析筆記Vue筆記
- Array、Slice、Map原理淺析
- MySQL事務原理淺析MySql
- HashSet淺析原理學習
- mydumper使用及原理淺析
- Webpack相關原理淺析Web
- ArrayList底層原理淺析
- 淺析Hadoop基礎原理Hadoop
- 淺析package.json中的devdependencies 和 dependenciesPackageJSONdev
- 淺析c++11中的“=default“和“=delete“C++delete
- 淺析mybatis中${}和#{}取值區別MyBatis
- 淺析 Kubernetes 控制器的工作原理
- JavaScript模組化原理淺析JavaScript
- 淺析Java8 Stream原理Java
- Flutter 高效能原理淺析Flutter
- iOS應⽤簽名原理淺析iOS
- 淺析RunLoop原理及其應用OOP