Angular中的MVC模式

MVC模式概述

MVC簡介

使用Angular中MVC的優(yōu)勢和缺點

  • 提升服務器性能
  • 減少項目開發(fā)時間
  • 頁面渲染緩慢
  • 頁面兼容性較差,不利于搜索引擎

Model組件

Model組件中,可以存儲和處理數據芦圾,同時還可以在組件中自定義模板澈段,通過模板實現與界面(View)層的通信和數據交互

Model組件的基本概念

在Angular的MVC模式下,Model屬于數據層,它即可以表示整個Anglar應用的數據模型對象亮元,也可以只表示某個實體對象

Model數據模型對象依附于作用域灯节,無論是整個模型對象或某個實體對象循头,都必須被Angular的作用域以屬性的方式進行引用,這種引用可以顯式或隱式的進行創(chuàng)建

html:

<div ng-controller="myCtrl">
  <div class="show">{{name}}</div>
  <!-- 隱式的創(chuàng)建數據模型score -->
  <input type="text" value="95" ng-model="score">
  <div class="show">{{score}}</div>
</div>

javascript:

var app = angular.module('myApp', []);
  app.controller('myCtrl', ['$scope', function ($scope) {
    // 顯式的創(chuàng)建數據模型name
    $scope.name = '張三';
  }])

使用ngRepeater方式遍歷Model對象

如果創(chuàng)建的模型對象是一個數組炎疆,那么就可以使用ngRepeater來遍歷這個模型對象

html:

<div ng-controller="myCtrl">
  <p ng-repeat="stu in data" class="show">
    <span>{{stu.name}}</span>
    <span>{{stu.sex}}</span>
  </p>
</div>

javascript:

var app = angular.module('myApp', []);
  app.controller('myCtrl', ['$scope', function ($scope) {
    $scope.data = [
      {name: "李青思", sex: "女"},
      {name: "張明明", sex: "女"},
      {name: "劉曉華", sex: "男"},
      {name: "陳忠忠", sex: "男"}
    ];
  }])

Controller組件

在Angular中卡骂,MVC中的C指的是Controller組件,即應用的控制器形入,本質上它是一個JavaScript的函數全跨,用于銜接頁面模板和邏輯代碼,并通過添加對象和行為來增強模板中作用域的功能

控制器的屬性和方法

在Angular中創(chuàng)建控制器是為了實現視圖模板與邏輯代碼的關聯亿遂,而實現關聯的方法是以scope.$new的方法向控制器中添加模型屬性

html:

<div ng-controller="myCtrl">
  <button ng-click="changeA()">李四</button>
  <button ng-click="changeB()">王二</button>
  <p class="show">我的名字叫: {{name}}</p>
</div>

javascript:

var app = angular.module('myApp', []);
  app.controller('myCtrl', ['$scope', function ($scope) {
    $scope.name = '張三';
    $scope.changeA = function () {
      $scope.name = '李四';
    }
    $scope.changeB = function () {
      $scope.name = '王二';
    }
  }])

控制器方法中的參數

在控制器中添加的方法與普通的函數一樣浓若,都可以添加參數,在調用過程中傳遞實參

html:

<div ng-controller="myCtrl">
  <div>
    <input type="text" ng-model="a" value="0">
    <span>{{type}}</span>
    <input type="text" ng-model="b" value="0">
    <span>=</span>
    <span>{{result}}</span>
  </div>
  <div>
    <button ng-click="change(1)">加法</button>
    <button ng-click="change(0)">乘法</button>
  </div>
</div>

javascript:

var app = angular.module('myApp', []);
  app.controller('myCtrl', ['$scope', function ($scope) {
    $scope.type = '+';
    $scope.change = function (t) {
      if (t) {
        $scope.type = '+';
        $scope.result = parseInt($scope.a) + parseInt($scope.b);
      } else {
        $scope.type = '*';
        $scope.result = $scope.a * $scope.b;
      }
    }
  }])

控制器中屬性和方法的繼承

Angular中的繼承與原生JavaScript有所不同蛇数,控制器中的繼承是由視圖模板的結構來定義的挪钓。處在子節(jié)點的模板控制器可以繼承父節(jié)點所對應的模板控制器,即可以直接訪問父節(jié)點控制器中的模型屬性和方法耳舅,反之則不行碌上。

html:

<div ng-controller="mainCtrl">
  <div>
    {{name_a+'/'+name_b+'/'+name_c+'/'+score}}
  </div>
  <div ng-controller="parentCtrl">
    <div>
      {{name_a+'/'+name_b+'/'+name_c+'/'+score}}
    </div>
    <div ng-controller="childCtrl">
      <div>
        {{name_a+'/'+name_b+'/'+name_c+'/'+score}}
      </div>
    </div>
  </div>
</div>

javascript:

var app = angular.module('myApp', []);
  app.controller('mainCtrl', ['$scope', function ($scope) {
    $scope.name_a = '張三';
    $scope.score = 60;
  }]);
  app.controller('parentCtrl', ['$scope', function ($scope) {
    $scope.name_b = '李四';
    $scope.score = 70;
  }]);
  app.controller('childCtrl', ['$scope', function ($scope) {
    $scope.name_c = '王二';
    $scope.score = 80;
  }])

一般來時候,一個控制器值包括一個對應視圖模板的業(yè)務邏輯浦徊,不應將過多的頁面DOM操作加入到控制器中绍赛,這樣做會加大測試難度。另外辑畦,不屬于視圖業(yè)務邏輯的數據請求和獲取吗蚌,應盡量通過服務調用的形式來實現,而不是在控制器中實現纯出。

View組件

在Angular的MVC模式下蚯妇,V就是視圖層敷燎,即View組件。它的外形取決于視圖模板箩言,內部數據來源于控制器硬贯。我們可以通過ng-view指令加載和切換視圖模板,并將視圖組件通過ng-controller指令與控制器相綁定

View組件中的模板切換

Angular應用由一個單頁來實現陨收,為了在視圖模板中實現多個功能饭豹,需要在頁面的局部進行刷新或切換,這樣我們就需要在視圖中引入ng-view指令务漩,在控制器中引入$routeProvider服務

html:

<div>
  <a href="#/">首頁</a> |
  <a href="#/book">圖書</a> |
  <a href="#/game">游戲</a>
</div>
<!-- 使用ng-view指令定義容器裝載不同的頁面內容 -->
<div ng-view></div>

javascript:

<script src="./angular.min.js"></script>
// routeProvider沒有集成在angular的源碼中拄衰,需要單獨引入
<script src="./angular-route.min.js"></script>
<script>
  var app = angular.module('myApp', ['ngRoute']);
  app.controller('indexController', ['$scope', function ($scope) {
    $scope.title = '這是首頁';
  }]);
  app.controller('bookController', ['$scope', function ($scope) {
    $scope.title = '這是圖書頁';
  }]);
  app.controller('gameController', ['$scope', function ($scope) {
    $scope.title = '這是游戲頁';
  }]);
  app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.when('/', {
      controller: 'indexController',
      template: '<div>{{title}}</div>'
    })
    .when('/book', {
      controller: 'bookController',
      template: '<div>{{title}}</div>'
    })
    .when('/game', {
      controller: 'gameController',
      template: '<div>{{title}}</div>'
    })
    .otherwise({
      redirectTo: '/'
    });
  }]);
</script>

在切換視圖模板時傳遞參數

在切換視圖模板時,我們還可以傳遞參數饵骨,并且可以將一個頁面的文件名作為切換的模板地址翘悉。所以,我們可以將一個應用分隔成多個功能頁居触,由它們完成不同的模塊功能

html:

<div ng-view></div>

javascript:

<script src="../angular.min.js"></script>
<script src="../angular-route.min.js"></script>
<script>
  var app = angular.module('myApp', ['ngRoute']);
  app.controller('stuListController', ['$scope', function ($scope) {
    $scope.students = students;
  }]);
  app.controller('stuDetailController', ['$scope', '$routeParams',
    function ($scope, $routeParams) {
      for (var i=0; i<students.length; i++) {
        if (students[i].stuId == $routeParams.id) {
          $scope.student = students[i];
          break;
        }
      }
  }]);
  app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider
    .when('/', {
      controller: 'stuListController',
      templateUrl: 'stuList.html'
    })
    .when('/view/:id', {
      controller: 'stuDetailController',
      templateUrl: 'stuDetail.html'
    })
    .otherwise({
      redirectTo: '/'
    });
  }]);
  var students = [
    {stuId: 1000, name: '張明明', sex: '女', score: 60},
    {stuId: 1001, name: '李青思', sex: '女', score: 80},
    {stuId: 1002, name: '劉曉華', sex: '男', score: 90},
    {stuId: 1003, name: '陳忠忠', sex: '男', score: 70}
  ];
</script>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末妖混,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子轮洋,更是在濱河造成了極大的恐慌制市,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弊予,死亡現場離奇詭異息堂,居然都是意外死亡,警方通過查閱死者的電腦和手機块促,發(fā)現死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來床未,“玉大人竭翠,你說我怎么就攤上這事∞备椋” “怎么了斋扰?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長啃洋。 經常有香客問我传货,道長,這世上最難降的妖魔是什么宏娄? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任窑邦,我火速辦了婚禮抹蚀,結果婚禮上,老公的妹妹穿的比我還像新娘钦奋。我一直安慰自己,他們只是感情好蟆盹,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般忧饭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筷畦,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天词裤,我揣著相機與錄音,去河邊找鬼鳖宾。 笑死吼砂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的攘滩。 我是一名探鬼主播帅刊,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漂问!你這毒婦竟也來了赖瞒?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤蚤假,失蹤者是張志新(化名)和其女友劉穎栏饮,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體磷仰,經...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡袍嬉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了灶平。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伺通。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逢享,靈堂內的尸體忽然破棺而出罐监,到底是詐尸還是另有隱情,我是刑警寧澤瞒爬,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布弓柱,位于F島的核電站,受9級特大地震影響侧但,放射性物質發(fā)生泄漏矢空。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一禀横、第九天 我趴在偏房一處隱蔽的房頂上張望屁药。 院中可真熱鬧,春花似錦柏锄、人聲如沸者祖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽七问。三九已至蜓耻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間械巡,已是汗流浹背刹淌。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留讥耗,地道東北人有勾。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像古程,于是被迫代替她去往敵國和親蔼卡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容