日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
借助AngularJS寫優(yōu)雅的代碼

接觸AngularJS還真有點(diǎn)碰巧,在用JQuery寫數(shù)據(jù)綁定的時(shí)候,我被數(shù)據(jù)對象和DOM之間的同步整煩了,要寫一大堆方法綁定和取值/設(shè)值的代碼邏輯,丑得要死。簡單說來,就是:

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元洪江做網(wǎng)站,已為上家服務(wù),為洪江各地企業(yè)和個人服務(wù),聯(lián)系電話:18982081108

  1. 數(shù)據(jù)對象發(fā)生變更以后,要及時(shí)更新DOM樹;
  2. 用戶操作改變DOM樹以后,要回頭更新數(shù)據(jù)對象

這個問題還是舉例來說清楚一些,比如我定義了這樣一個queryObj:

 
 
  1. {name: "sally", price: 30}

現(xiàn)在有這樣的DOM對象:

 
 

1、queryObj發(fā)生變化的時(shí)候,這兩個DOM對象要及時(shí)更新,一個是value需要更新,一個則是標(biāo)簽里面的文本需要更新。

我就得寫這樣的JQuery設(shè)值語句:

 
 
  1. $("input").val(queryObj.name);
  2. $("label").text(queryObj.name);

2、當(dāng)用戶操作改變input里面的值的時(shí)候,我也需要同步更新label里面的值,以及queryObj里面的值:

 
 
  1. $("input").keydown(function(){
  2.     var data = $(this).val();
  3.     $("label").text(data);
  4.     queryObj.name = data;
  5. });

可以想象在DOM對象很多的時(shí)候,這種綁定語句和設(shè)值語句惡心得令人發(fā)指。

就這個問題,第1條對象的變更需要及時(shí)刷新到DOM上,有好多辦法,underscore.js、mustache之類的,模板+數(shù)據(jù)綁定嘛,當(dāng) 然,需要手動調(diào)用來更新;但是反過來的第2條,DOM變更需要及時(shí)刷新到其它DOM對象上,也要刷回?cái)?shù)據(jù)對象,我找了一會兒,也沒有看見有什么現(xiàn)成的實(shí) 現(xiàn),正火大地準(zhǔn)備自己寫一個簡單的機(jī)制,這時(shí)Google到了AngularJS的“two way binding”,哈哈,暗爽,這不正是我想要的東西么?

鑒于這不是AngularJS的教程。在此我假設(shè)你有AngularJS的基礎(chǔ)知識,否則,建議你先閱讀AngularJS簡單易懂的教程。

雙向綁定

不管是MVC還是MVVM,數(shù)據(jù)綁定的過程總是惹人厭煩的,這樣的事情做得越少越好;如果需要數(shù)據(jù)綁定的逆過程,這樣的問題是現(xiàn)有MVC框架所很少考慮到的。AngularJS不但把雙向綁定的事情替我做了,而且也避免了特定視圖類的定義,直接使用原始的數(shù)據(jù)對象就好。

還是就上面這個問題,在寫HTML標(biāo)簽的時(shí)候,增加ng-app和一個ng-controller的屬性,至于占位符,和普通的模板機(jī)制沒有什么區(qū)別:

 
 
  1.     
  2.     

并且定義一個和ng-controller同名的方法,參數(shù)名為$scope:

 
 
  1. function QueryController($scope) {
  2.     $scope.queryObj = {name : "sally", price : 30};
  3. }

完畢了,這以后label、input和$scope.queryObj這三者就同步了,DOM變化的時(shí)候,其它二者也會被及時(shí)更新。這就是AngularJS的雙向綁定。我覺得這大概是AngularJS最精華的部分。

AngularJS官網(wǎng)的教程上,還給了這樣的說明:

從上面的例子,控制器、模板、數(shù)據(jù)模型、視圖,這幾個概念和之間的關(guān)系應(yīng)該已經(jīng)明晰了。

AngularJS遵循的設(shè)計(jì)理念,是構(gòu)建UI應(yīng)當(dāng)用聲明式的方式來(什么是聲明式編程,請參閱我關(guān)于編程范型的文章)。值得一提的是,AngularJS引入的directive確實(shí)方便擴(kuò)展了標(biāo)簽集,可以寫出DSL樣子的代碼,非常非常靈活,比如:

 
 
  1.   

    Error occurs.

這其中的Alert就是通過directive實(shí)現(xiàn)的自定義的標(biāo)簽,最終可以被解析成具備“警告”樣式的html,但是,在對于directive的定義上面,就連官網(wǎng)的例子都是,生寫html片段模板代碼字符串的,用起來確實(shí)讓我不夠舒服。

依賴注入

依賴注入(Dependency Injection,DI)對于使用過Spring的程序員來說實(shí)在是再熟悉不過了,所謂依賴注入,就是把某個過程中注入值的步驟交給外部框架、容器來完成。舉例來說,這樣的代碼:

 
 
  1. function PhoneListCtrl($scope, $http) {
  2.   $http.get('phones/phones.json').success(function(data) {
  3.     $scope.phones = data;
  4.   });
  5.   $scope.orderProp = 'age';
  6. }

$scope、$http都是需要AngularJS框架傳入的服務(wù)變量,在此,參數(shù)的名字不可隨意修改,因?yàn)锳ngularJS是根據(jù)它來判定需要依賴注入的。

服務(wù)可以自己定義,再利用依賴注入的方式加進(jìn)來使用,這對于模塊化和重用是很有幫助的。

過濾器

AngularJS的表達(dá)式功能比較弱,不支持條件判斷和流程控制,不過好在支持過濾器,這就一定程度上彌補(bǔ)了這個缺憾。過濾器是個很有趣的特 性,讓人想起了管道編程。到這里,開個玩笑,你大概也發(fā)現(xiàn)AngularJS真是一個到處抄襲,哦不,是借鑒各種概念和范型的東西,比如依賴注入抄 Spring,標(biāo)簽定義抄Flex,過濾器抄Linux的管道:

 
 
  1. {{ "lower cap string" | uppercase }}
  2. {{ 1304375948024 | date:"MM/dd/yyyy @ h:mma" }}

既然是管道編程,那么肯定支持迭代地使用管道:

 
 

事件處理

解耦一定是相對的,在我們使用各種綁定語句把onClick="javascript:xxx"從DOM上拿掉的時(shí)候,我們就已經(jīng)想到,總有一天,寫那些DOM事件綁定的語句寫煩了,一定還會拿回來:

 
 

相應(yīng)地,定義setImage:

 
 
  1. $scope.setImage = function(imageUrl) {
  2.     $scope.mainImageUrl = imageUrl;
  3. }

無論是把這個綁定關(guān)系拿走還是拿回來,都是有道理的,選擇你最傾心的方式。就我而言,我傾向于把同一模塊的代碼放置在一起,增加可理解性,而不在乎它的組成是DOM聲明還是JavaScript解釋。

另外,值得一提的是不同controller之間的通信方式,AngularJS推薦的方式是采用事件,具體說,controller是可以嵌套 的,$broadcast會把事件廣播給所有子controller,而$emit則會將事件冒泡傳遞給父controller,$on則是 AngularJS的事件注冊函數(shù):

 
 
  1. $scope.$on("DataChange", function (event, msg) {
  2.     $scope.$broadcast("DataChange", msg);
  3. });

但是,這讓我頗為不爽,如果我的兩個視圖在不同的controller內(nèi),我還非得要通過事件機(jī)制來保持同步的話,如此啰嗦,我還需要AngularJS干嘛?

吐槽歸吐槽,AngularJS還是非常值得學(xué)習(xí)使用的,尤其是其中的雙向綁定,用起來真是太爽了。***附加幾個有用的鏈接:

  • 官網(wǎng)教程
  • 《使用AngularJS開發(fā)下一代Web應(yīng)用》譯者的博客
  • Angular Guide的社區(qū)翻譯版本(比原文包含更多的東西)
  • Make Your Own AngularJS
  • Angular UI

當(dāng)前標(biāo)題:借助AngularJS寫優(yōu)雅的代碼
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/dpjghoc.html