日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

AngularJS深入(1)——加载启动

發布時間:2025/3/14 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AngularJS深入(1)——加载启动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本系列文章的分析基于AngularJS?v1.4.2.

參考資料有:

  • AngularJS API Docs
  • AngularJS Developer Guide
  • AngularJS實戰
  • Service vs provider vs factory

1. 整體結構

AngularJS的源碼在整體上,與其它很多庫和框架一樣,是一個自執行函數,其整體結構簡化如下:

(function(window, document, undefined) {// define variables and functions// and do some operationsif (window.angular.bootstrap) {console.log('WARNING: Tried to load angular more than once.');return;}bindJQuery();publishExternalAPI(angular);jqLite(document).ready(function() {angularInit(document, bootstrap);}); })(window, document);

?

整體思路為:

  • 首先是一些全局變量和方法的定義,以及一些其它操作;
  • 通過window.angular.bootstrap判斷是否已經加載angular,如果已經加載,則直接退出;
  • 執行bindJQuery(),如果已經加載了jQuery,則AngularJS會使用已經加載的jQuery,否則使用內部實現的JQLite,其相當于是一個簡化版的jQuery;
  • 執行publishExternalAPI(angular)來為全局變量angular增加屬性和方法,并建立起模塊機制,注冊核心模塊;
  • 在文檔加載完成后執行angularInit()。

2. bindJQuery

該方法主要是綁定jQuery,簡化后的代碼如下:

var bindJQueryFired = false;function bindJQuery() {if (bindJQueryFired) {return;}var jqName = jq();jQuery = window.jQuery;if (isDefined(jqName)) {jQuery = jqName === null ? undefined : window[jqName];}if (jQuery && jQuery.fn.on) {jqLite = jQuery;// ... ...} else {jqLite = JQLite;}angular.element = jqLite;bindJQueryFired = true; }
  • bindJQueryFired相當于是一個標志符,初始值為false。在執行bindJQuery的時候,先判斷bindJQueryFired的值,如果其為true,則說明已經執行過jQuery綁定,直接返回;否則執行綁定過程,并將bindJQueryFired的值設置為true;
  • jqName是調用jq()的返回值,jq()的主要作用是遍歷文檔,找出第一個包含屬性ng-jq的節點,然后取其屬性值;
  • 變量jQuery取值為window.jQuery,如果加載了jQuery函數庫,則其值非空;
  • 在應用了ng-jq指令的情況下,如果jQName的值不為null,則設置變量jQuery的值為window[jqName],否則設置為undefined
  • 如果jQuery變量有效,則使用jQuery變量指定的庫;否則使用內置實現的JQLite。

總結起來,綁定的jQuery可以的來源有三個:ng-jq指定、引入的jQuery庫、內置實現的JQLite,其使用流程為:

  • 如果有ng-jq
    • 如果ng-jq的值不為空,則使用它指定的庫
    • 如果ng-jq指定的值為空,則變量jQuery的值為undefined,此時強制使用JQLite,無論是否引入了jQuery庫
  • 如果沒有ng-jq
    • 如果引入了jQuery庫,則使用它
    • 如果沒有引入jQuery庫,則使用JQLite

3. publishExternalAPI

該方法的代碼簡化如下:

function publishExternalAPI(angular) {extend(angular, {// ... ... });angularModule = setupModuleLoader(window);try {angularModule('ngLocale');} catch (e) {angularModule('ngLocale', []).provider('$locale', $LocaleProvider);}angularModule('ng', ['ngLocale'], ['$provide',function ngModule($provide) {// ... ... }]); }

主要功能為:

  • 對angular對象進行擴展;
  • 執行setupModuleLoader(window),該方法主要是定義了angular.module方法,用于注冊及獲取模塊;angular.module只有一個參數的時候為獲取模塊,否則為注冊模塊;
  • 如果沒有注冊ngLocal模塊,則對其進行注冊;
  • 注冊ng模塊,也就是AngularJS的核心模塊。

4. angularInit

該方法的主要作用是啟動Angular應用。相關代碼為:

var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];function getNgAttribute(element, ngAttr) {var attr, i, ii = ngAttrPrefixes.length;for (i = 0; i < ii; ++i) {attr = ngAttrPrefixes[i] + ngAttr;if (isString(attr = element.getAttribute(attr))) {return attr;}}return null; }function angularInit(element, bootstrap) {var appElement,module,config = {};// The element `element` has priority over any other elementforEach(ngAttrPrefixes, function(prefix) {var name = prefix + 'app';if (!appElement && element.hasAttribute && element.hasAttribute(name)) {appElement = element;module = element.getAttribute(name);}});forEach(ngAttrPrefixes, function(prefix) {var name = prefix + 'app';var candidate;if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {appElement = candidate;module = candidate.getAttribute(name);}});if (appElement) {config.strictDi = getNgAttribute(appElement, "strict-di") !== null;bootstrap(appElement, module ? [module] : [], config);} }

需要說明的是,AngularJS支持的屬性前綴有多種,包括ng-、data-ng、ng:和x-ng-。

  • 首先對element進行檢測,看它是否有ng-app等屬性,如果有則設定appElement和module;
  • 如果element元素沒有ng-app等屬性,則對其后繼元素進行查找,找到第一個有ng-app等屬性的元素,從而設定appElement和module;
  • 如果appElement不為空,即找到了應用的入口元素,則執行bootstrap。

需要注意的是,如果有多個元素都有ng-app屬性,則只會找到第一個并啟動它,而后面的應用則不會自動啟動。

5. 應用啟動

應用的啟動方式主要包括自動啟動和手動啟動。

(1)自動啟動

例如:

<div ng-app="MyModule"><div ng-controller="ctrl">{{ name }}</div> </div> <script>var myModule = angular.module('MyModule', []);myModule.controller('ctrl', ['$scope', function($scope) {$scope.name = 'alex';}]); </script>

在這個例子中,對于最外層的div設置了ng-app屬性,因此會自動啟動應用。

(2)手動啟動

例如:

<div><div ng-controller="ctrl"></div> </div> <script>var myModule = angular.module('MyModule', []);myModule.controller('ctrl', ['$scope', function($scope) {$scope.name = 'alex';}]);angular.element(document).ready(function() {angular.bootstrap(document, ['MyModule']);}); </script>

?

由于沒有設置ng-app,因此需要通過angular.bootstrap來手動啟動應用。

(3)多個應用的啟動

一般情況下,一個頁面中只有一個應用,但是一個頁面上多個應用也是可以共存的。通過上面對源碼的分析,可以知道,只有第一個應用會自動啟動,因此其余的應用需要手動來啟動,例如:

<div id="app1" ng-app="MyModule1"><div ng-controller="ctrl1"></div> </div> <div id="app2" ng-app="MyModule2"><div ng-controller="ctrl2"></div> </div> <script>var myModule1 = angular.module('MyModule1', []);myModule1.controller('ctrl1', ['$scope', function($scope) {$scope.name = 'alex';}]);var myModule2 = angular.module('MyModule2', []);myModule2.controller('ctrl2', ['$scope', function($scope) {$scope.greeting = 'hello';}]);angular.element(document).ready(function() {angular.bootstrap(document.getElementById('app2'), ['MyModule2']);}); </script>

?

?

轉載于:https://www.cnblogs.com/folyred/p/4723773.html

總結

以上是生活随笔為你收集整理的AngularJS深入(1)——加载启动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91大神视频在线播放 | 天天干中文字幕 | 裸体一区二区三区 | 91看片成人 | 青青青免费视频观看在线 | 我我色综合 | 亚洲网站免费看 | 国产农村妇女毛片精品 | 亚洲精品影院在线 | 懂色aⅴ一区二区三区免费 国产精品99在线观看 | 91漂亮少妇露脸在线播放 | 美女黄免费 | 99精品人妻国产毛片 | 国产一区视频在线免费观看 | 日韩美女做爰高潮免费 | 一区二区三区在线视频播放 | 人人看人人看 | 久久爱一区 | 含羞草一区二区三区 | 欧美一区二区三区视频在线 | 999这里有精品 | 日韩簧片| 成片免费观看视频 | 91精品国产欧美一区二区成人 | 另类亚洲色图 | 中文字幕永久在线视频 | 久草视频在线免费看 | 一级黄色美女视频 | 成人欧美一区二区三区黑人孕妇 | 色亚洲成人 | 泰剧19禁啪啪无遮挡 | 亚洲第一中文字幕 | 欧美成人黄色 | 国产成人黄色 | 成人精品视频99在线观看免费 | 青草国产 | 欧美日韩在线中文字幕 | 日本视频网 | 午夜成年人视频 | 日本久久激情 | 久久久免费观看视频 | 亚洲视频在线观看免费 | 欧美特级黄色 | 欧美一级无毛 | 久久中文精品 | 日日摸夜夜添狠狠添久久精品成人 | 成人免费大片黄在线播放 | 亚洲第一色视频 | 亚洲国产影视 | 四虎影视免费永久大全 | 欧美呦呦呦 | 亚洲三级免费 | 国产精品久久久久久久久晋中 | 毛片基地站| 日韩精品免费一区二区在线观看 | 欧美性狂猛xxxxxbbbbb | 中字av在线| 美女隐私无遮挡免费 | 亚洲黄色在线视频 | 给我看高清的视频在线观看 | 二区不卡 | 张津瑜国内精品www在线 | 日本精品视频一区二区 | 日韩一级欧美一级 | 日韩一区电影 | 免费a级 | 国产成人无码精品亚洲 | 少妇系列在线观看 | 开心激情播播 | 337p亚洲精品色噜噜狠狠 | 少妇又紧又色又爽又刺激视频 | 粗大黑人巨茎大战欧美成人免费看 | 国产黄a三级三级看三级 | 香蕉视频三级 | 久草手机在线视频 | 国产午夜精品一区二区三区嫩草 | 日韩精品中文字幕在线播放 | 韩漫动漫免费大全在线观看 | 黄色一级免费视频 | 成人免费毛片男人用品 | www黄色片 | 黄色aa毛片| 日本啪啪网站 | 色爽视频 | 神秘马戏团在线观看免费高清中文 | 久久肉| 日韩激情图片 | 懂色av懂色av粉嫩av分享吧 | 中文字幕 欧美日韩 | 让人下面流水的视频 | 韩国精品视频在线观看 | 免费人成在线 | av免费亚洲 | 黄色a在线观看 | 日皮视频在线观看 | 天堂综合网 | 久久最新免费视频 | 亚洲妇女体内精汇编 | 国产日韩欧美中文 |