成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

借助AngularJS寫優雅的代碼

開發 前端
接觸AngularJS還真有點碰巧,在用JQuery寫數據綁定的時候,我被數據對象和DOM之間的同步整煩了,要寫一大堆方法綁定和取值/設值的代碼邏輯,丑得要死。

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

  1. 數據對象發生變更以后,要及時更新DOM樹;
  2. 用戶操作改變DOM樹以后,要回頭更新數據對象

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

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

現在有這樣的DOM對象:

  1. <input type="text" value="sally" /> 
  2. <label>sally</label> 

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

我就得寫這樣的JQuery設值語句:

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

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

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

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

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

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

雙向綁定

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

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

  1. <div ng-app ng-controller="QueryController"
  2.     <input type="text" value="{{queryObj.name}}" /> 
  3.     <label>{{queryObj.name}}</label> 
  4. </div> 

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

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

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

AngularJS官網的教程上,還給了這樣的說明:

從上面的例子,控制器、模板、數據模型、視圖,這幾個概念和之間的關系應該已經明晰了。

AngularJS遵循的設計理念,是構建UI應當用聲明式的方式來(什么是聲明式編程,請參閱我關于編程范型的文章)。值得一提的是,AngularJS引入的directive確實方便擴展了標簽集,可以寫出DSL樣子的代碼,非常非常靈活,比如:

  1. <Alert> 
  2.   <p>Error occurs.</p> 
  3. </Alert> 

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

依賴注入

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

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

$scope、$http都是需要AngularJS框架傳入的服務變量,在此,參數的名字不可隨意修改,因為AngularJS是根據它來判定需要依賴注入的。

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

過濾器

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

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

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

  1. <li ng-repeat="phone in phones | filter:query | orderBy:orderProp" class="thumbnail"> 

事件處理

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

  1. <img ng-src="{{img}}" ng-click="setImage(img)"> 

相應地,定義setImage:

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

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

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

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

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

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

原文鏈接:http://www.raychase.net/2270

責任編輯:陳四芳 來源: 四火的嘮叨
相關推薦

2020-04-03 14:55:39

Python 代碼編程

2017-06-26 09:40:50

Python代碼寫法

2017-07-07 16:57:35

代碼Python

2014-08-08 13:40:53

AngularJS模塊

2024-06-24 14:19:48

2025-04-02 12:20:00

開發代碼函數

2022-05-24 06:07:48

JShack用戶代碼

2022-08-01 23:45:23

代碼識別項目

2012-07-03 09:59:03

程序員

2019-09-20 15:47:24

代碼JavaScript副作用

2022-03-11 12:14:43

CSS代碼前端

2023-07-30 22:25:00

JavaScrip服務端Web

2021-01-04 07:57:07

C++工具代碼

2024-02-23 08:57:42

Python設計模式編程語言

2022-05-09 14:33:20

代碼設計設計模式

2017-09-27 16:09:29

代碼

2021-09-08 08:34:37

Go 文檔Goland

2017-01-13 13:35:42

Windows錯誤代碼

2018-07-23 08:19:26

編程語言Python工具

2024-06-19 10:04:15

ifC#代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区四区国产 | 精品一区二区三 | 亚洲 中文 欧美 日韩 在线观看 | 综合色播 | 亚洲影音先锋 | 久久精品国产免费一区二区三区 | 精久久 | 国产成人免费视频网站高清观看视频 | 免费黄视频网站 | 日韩中文字幕免费在线 | 日韩精品一 | 99精品免费 | 国产成人精品一区 | av色在线 | 韩国av一区二区 | 黄色电影在线免费观看 | 国产中文字幕在线观看 | 国产日韩精品视频 | 亚洲国产精品99久久久久久久久 | 在线一区观看 | 久久久成人一区二区免费影院 | 国产欧美精品区一区二区三区 | 久久久成 | 成人在线一区二区三区 | 精品美女久久久 | 久久久久国产一区二区三区 | 视频在线一区二区 | 亚洲精品99| 亚洲国产精品久久人人爱 | 午夜影视免费片在线观看 | 精品一区二区三区在线观看 | 日韩欧美一区二区在线播放 | 午夜精品久久久久久久久久久久 | 91精品国产91久久久久久丝袜 | 色吊丝2| 久久午夜视频 | 中文字幕不卡视频在线观看 | 秋霞影院一区二区 | 中文精品久久 | 亚洲一区二区三区四区五区午夜 | 亚洲成人精品在线 |