angularJs的子產品化
-
1.子產品化的好處是:
(1)減少變量之間的污染
(2)可以實作子產品之間的互相依賴
-
2.angularJs的子產品化的實作:
(1)
angular.module("app",[])
,該方法接收兩個參數:
第一個參數是子產品化的名字;
第二個參數是數組類型,存放要依賴的子產品。如果需要依賴任何模 塊,直接寫一個空數組就行。
(2) 在此之後需為頁面中的”ng-app”指定初始化子產品;
(3) app.controller(“Bbb”,Bbb),該方法接收兩個參數:
第一個是函數名稱,第二個是函數
注意: 在`app.controller(“Aaa”,function( scope)‘中,函數的形參作為依賴注入,必須得寫成這樣” scope”.作為開發版本這樣寫沒問題,但是作為線上版本不行。 因為上線前會對JS代碼進行壓縮處理,壓縮工具可能會把“$scope”壓縮成一個非常簡短的名字,那麼這個局部作用域就找不到了。 為了解決這個問題,AngularJS子產品提供一種數組的書寫方式:<pre> <!DOCTYPE html> <!--ng-app需要指定初始子產品是哪個--> <html ng-app="app"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); //一個頁面中可能會有多個子產品,都可以作為初始子產品 // angular.module("app2",[]); //為指定子產品設定一控制器,設定兩個參數:第一個是函數名稱,第二個是函數 app.controller("Aaa",function($scope){ $scope.name="hello"; }); app.controller("Bbb",Bbb); function Bbb($scope){ $scope.name="hi"; } </script> </head> <body> <div ng-controller="Aaa"> <p>{{name}}</p> </div> <div ng-controller="Bbb"> <p>{{name}}</p> </div> </body> </html> </pre>
通過上述形式得到了一種對應關系,壓縮工具将函數的形參壓縮就沒有影響,如下面代碼所示://這裡寫的字元串形式的"$scope",對應函數的第一個形參 app.controller("Aaa",["$scope",function($scope){ $scope.name="hello"; }]);
是以,建議在寫Angular子產品化時,采用這種數組形式的寫法,避免壓縮後代碼運作有問題。//運作結果與開發版本的一緻 app.controller("Aaa",["$scope",function($s){ $s.name="hello"; }]);
AngularJs的工具方法
其實上文中的angular.module方法也是一種AnularJs的工具方法
(1)angular.bind
angular.bind方法與JQuery中的$.proxy()方法非常類似:修改this的指向。
與JS中的bind方法也很類似。
<pre>
<script type="text/javascript">
function show(n1,n2){
console.log(n1,n2);
alert(this);
}
//這三種寫法的運作效果差不多
/*angular.bind(document,show)(3,4);*/
/* angular.bind(document,show,3,4)();*/
angular.bind(document,show,3)(4);
</script>
</pre>
(2)angular.copy
用來拷貝對象
<pre>
var a={
name:"hello"
};
var b={
age:20
}
var c=angular.copy(a,b);//a把所有值覆寫給了b
console.log(b);//列印{ name:"hello" }
console.log(c);//列印{ name:"hello" }
</pre>
(3)angular.extend
對象繼承
var a={
name:"hello"
};
var b={
age:20
}
var c2=angular.extend(b,a);//b繼承a的值
console.log(b);//列印出{ age:20,name:"hello" },c的值和b的值是一緻的
(4)angular的判斷元素類型的工具方法
- angular.isArray(arr);//判斷是否為數組,如果是的話,該方法傳回true
- angular.isDate(arr);//判斷是否為時間對象,如果是的話,該方法傳回true
- angular.isDefined(arr);//判斷一個元素是否存在,如果元素不是undefined,該方法傳回true
- angular.isUndefined(arr);
- angular.isFunction(arr);
- angular.isNumber(arr);
- angular.isObject(arr);
- angular.isString(arr);
- angular.isElement(arr);//用來判斷是否為一個元素
window.οnlοad=function(){
//列印出true
console.log(angular.isElement(document.body);
//列印出false
console.log(angular.isElement("12a");
//列印出true,說明此方法支援用JQuery的形式書寫的元素
console.log(angular.isElement($(document.body));
}
說明:此方法支援用JQuery的形式書寫的元素
(5)angular的其它工具方法
- angular.version //判斷目前所使用的angularJs的版本
//傳回值是一個對象,結果如下圖所示:console.log(angular.version);
angularJs(三)--angularJs的子產品化和工具方法 -
angular.equals(a,b)//判斷兩個元素是否相等
(1)
(2)console.log(angular.equals(3,"3"));//列印出false
var a=[],b=[]; console.log(angular.equals(a,b));//列印出true
與angular.equals()方法不同的是,在原生JS中,a!=b,認為是兩個不同的引用
(3)
與angular.equals()方法不同的是,在原生JS中,NaN不與任何值相等,包括它自身。console.log(angular.equals(NaN,NaN));//列印出true
-
angular.forEach()方法:周遊對象
接收三個參數:
(1)第一個參數:目标對象
(2)第二個參數:處理函數
var arr=["a","b","c"];
angular.forEach(arr,function(value,index){
console.log(value,index);//分别列印數組的每一項的值和下标
});
var obj={name:"hello",age:20};
angular.forEach(obj,function(value,key){
console.log(value,key);//分别列印對象的每一項的鍵值和鍵名
(3)第三個參數:處理函數得到的結果。 </br>
<pre>
var obj1={name:"hello1",age:10};
var result=[];
angular.forEach(obj1,function(value,key){
//此處的this指的是第三個參數
this.push(key+"_"+value);
},result);
console.log(result);//列印出["name_hello1", "age_10"]
</pre>
- angular.fromJson/toJson
類似原生的JSON.parse(str)及JSON.stringify(object)方法。
var str='{"name":"hi","age":"20"}';
var obj=angular.fromJson(str);
var ob2={"name":"hi","age":"20"};
//var str2=angular.toJson(ob2);
//将angular.toJson方法的第二個參數設定成true,
//就能使json字元串像對象一樣的分行顯示,便于閱讀
var str2=angular.toJson(ob2,true);
console.log(str2);
-
angular.identity/noop輔助方法
這兩個方法都是用來進行預設操作的
var str="hello" //此方法傳回的是傳入的參數 console.log(angular.identity(str));//hello //此方法是生成一個空函數 console.log(angular.noop());//列印出undefined
-
angular.lowercase(str)/uppercase(str)方法
類似原生JS中轉小寫/轉大寫的方法
-
angular.element()方法
擷取指定元素,類似JQuery中的$(…)方法
var oDiv=document.getElementById("div1");
//搭配JQuery中的css方法使用,運作正确
angular.element(oDiv).css("background","red");
注意:
(1) 直接這樣寫:
angular.element('#div1').css("background","red");
,在angular.element()方法中直接寫選擇器,是不行的。
如果想實作此種寫法,要先引入JQuery庫檔案,angular内部就會做一個這樣的處理:
angular.element====$
(2) 綜上說明:AngularJs融入了部分JQuery的方法。具體融入了哪些JQuery方法可去官網文檔進行查詢。
-
angular.bootstrap方法
(1)可以實作動态地初始化
(2)可以用它來實作多個子產品的初始化 注意:一個頁面用指令的形式初始化隻能初始化一次,如下代碼所示:<pre> <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller("Aaa",["$scope",function($scope){ $scope.name="hello"; }]); //實作了在需要的時候初始化 document.onclick=function(){ ;//等同于在html标簽裡的ng-app指令,兩者都可以不寫子產品名字,即angular.bootstrap(document,[]) angular.bootstrap(document,['app']) } </script> </head> <body> <div ng-controller="Aaa"> <p>{{name}}</p> </div> </body> </html> </pre>
運作結果如下圖所示:<html > <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller("Aaa",["$scope",function($scope){ $scope.name="hello"; }]); var app2=angular.module("app2",[]); app2.controller("Bbb",["$scope",function($scope){ $scope.name="hi"; }]); </script> </head> <body> //需要初始化兩次,實際上運作後隻會解析第一個子產品; <div ng-app="app" ng-controller="Aaa"> <p>{{name}}</p> </div> <div ng-app="app2" ng-controller="Bbb"> <p>{{name}}</p> </div> </body> </html>
要想實作多次初始化,可以用angular.bootstrap()方法,代碼如下:angularJs(三)--angularJs的子產品化和工具方法 <pre> <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <title>Title</title> <script src="js/angular.min.js"></script> <script type="text/javascript"> var app=angular.module("app",[]); app.controller("Aaa",["$scope",function($scope){ $scope.name="hello"; }]); var app2=angular.module("app2",[]); app2.controller("Bbb",["$scope",function($scope){ $scope.name="hi"; }]); document.onclick=function(){ var aDiv=document.getElementsByTagName("div"); angular.bootstrap(aDiv[0],["app"]); angular.bootstrap(aDiv[1],["app2"]); } </script> </head> <body> <!--<div ng-app="app" ng-controller="Aaa">--> <div ng-controller="Aaa"> <p>{{name}}</p> </div> <!--<div ng-app="app2" ng-controller="Aaa">--> <div ng-controller="Bbb"> <p>{{name}}</p> </div> </body> </html> </pre>
-
angular.injector
注冊器,主要是在Angular.js内部使用。
使用此方法還需學習一些angularJS的其它知識,故會在後面詳細講如何使用此方法。