国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
angularjs表單相關(guān)之封裝radio、select、filter
在這幾個(gè)月里,一直一邊學(xué)習(xí)angular,一邊重新把我們公司的后臺(tái)重寫。想象確實(shí)是美好的,但是時(shí)間起來真是苦難重重,不過功夫不負(fù)有心人,終于寫出一點(diǎn)靠譜的東西,而且應(yīng)用到實(shí)踐上,就一個(gè)字,爽!!以前費(fèi)半天勁想寫一個(gè)界面,還得考慮這個(gè),還得考慮那個(gè),真是費(fèi)死勁了?,F(xiàn)在似乎問題迎刃而解了,當(dāng)然,在用angular的前期還是要廢掉很多的腦力的,畢竟真的入門門檻有點(diǎn)高(主要對于我這種學(xué)渣來說,英語就是最大的障礙)。

好了,廢話不多說開始整。

一、為什么要這幾個(gè)一起說?

因?yàn)槲以趧?chuàng)建統(tǒng)一的filter時(shí),就發(fā)現(xiàn),哦~~原來還可以這么搞,確實(shí)省了不少代碼。當(dāng)然你要是處女座的話,我覺得你可以分開寫,只要注入就好了。反正對于我來說都是自己寫的指令,就暫時(shí)放在一起嘍。

書歸正題,首先這個(gè)地方我覺得還少了checkbox,但是目前沒有實(shí)踐,等實(shí)踐完了再把這塊內(nèi)容補(bǔ)上。

先說說大體思路,我們首先為我們需要的枚舉來建一個(gè)factory,然后用這個(gè)factory來指導(dǎo)自定義的radio,select ,filter。當(dāng)然,這只是我的一點(diǎn)淺見。

好了,下面說干就干。


二、實(shí)踐部分(我覺的直接上代碼比較容易,然后再講)

1. 最開始我們先建一個(gè)module(這個(gè)沒什么好講的)

[javascript] view plain copy
  1. <span style="font-size:18px;">var allInput = angular.module('allInput', []);</span>  


2. 新建一個(gè)我們需要的factory

[javascript] view plain copy
  1. <span style="font-size:18px;">allInput.factory('$status', function(){  
  2. <span style="white-space:pre">    </span>var status = {  
  3. <span style="white-space:pre">        </span>0: '審核拒絕',  
  4. <span style="white-space:pre">        </span>1: '審核通過',  //我故意省略2  
  5. <span style="white-space:pre">        </span>3: '未審核',  
  6. <span style="white-space:pre">        </span>4: '重新提交審核',  
  7. <span style="white-space:pre">        </span>'hehe': '已封禁' //如果后端的枚舉是hehe或者什么的我們應(yīng)該也能應(yīng)付  
  8. <span style="white-space:pre">    </span>};  
  9.   
  10. <span style="white-space:pre">    </span>return status;  
  11. });</span>  
[javascript] view plain copy
  1. <span style="font-size:18px;">  
  2. </span>  
[javascript] view plain copy
  1. <span style="font-size:18px;">//這個(gè)地方是兩個(gè)控件都要用到的公共配置</span>  
[javascript] view plain copy
  1. <span style="font-size:18px;"></span><pre name="code" class="javascript">allInput.factory('$defaultOption', function($status){  
  2.     return {  
  3.         status: {  
  4.             data: $status  
  5.         },  
  6.         //這個(gè)下面還可以填充好多類似于上面的東西  
  7.         removeDiff: function(a, b){  
  8.             //這塊的主要意思是b里面有的東西就要替換a  
  9.             if(a == null){  
  10.                 return b;  
  11.             }  
  12.   
  13.             if(b == null){  
  14.                 return a;  
  15.             }  
  16.   
  17.             //如果都沒有空,就返回a配置  
  18.             for (i in a){  
  19.                 if(i in b){  
  20.                     a[i] = b[i];  
  21.                 }  
  22.             }  
  23.   
  24.             return a;  
  25.         }  
  26.     };  
  27. });  

好了,解釋一下代碼,就是建一個(gè)factory,然后將status這個(gè)數(shù)組,用$status來表示,其實(shí)就是很簡單?。?!前面的索引數(shù)字代表的是枚舉值,后面代表的是含義,當(dāng)然,我們也可以寫成英文或者什么,并不影響什么。比如說已封禁那個(gè)。中間的2是我故意省去的,為了大家看了可以更好的舉一反三(或許對于程序員這種高智商的動(dòng)物并沒有什么卵用,anyway)

后面這個(gè)地方是我又思考了一下,粘貼在上面的,因?yàn)榭梢蕴岢鰜砉餐褂?/span>

3. 新建一個(gè)filter

  1. allInput.filter('status', function($status){  
  2.     return function(input){  
  3.         return input in $status ? $status[input] : '未知';  
  4.     }  
  5. });  

好了,一個(gè)合理合法的filter就這么建好了,是不是特別的開心?是不是特別的簡單,當(dāng)然,我們也可以不用引入$status,我們只要把$status那一坨放在filter的回調(diào)函數(shù)里就可以啦,呵呵呵


4. 建一個(gè)統(tǒng)一的select控件

[javascript] view plain copy
  1. <span style="font-size:18px;">allInput.directive('selectInput', function($defaultOption){</span><span style="font-size:18px;">  
  2.     return {  
  3.         restrict: 'AE',  
[javascript] view plain copy
  1. <span style="white-space:pre">        </span>replace: ture,  
  2.         scope: {  
  3.             ngType: '@',  //這個(gè)地方是為了說明這個(gè)控件到底要顯示哪個(gè)枚舉(我們可能有多個(gè)枚舉)  
  4.             myConfig: '='//這個(gè)地方可以傳入一些我們自定義的配置,這樣我們就可以不用局限于他自己的type了           
  5.         },  
  6.         //我這里寫到controller純粹是因?yàn)樗唵?,第二一點(diǎn),我也沒有真正理解,為什么放入link是最佳實(shí)踐  
  7.         //這里的$selectOption 是我們要為了自定義的方法而用的,看到這里不明白先不要著急  
  8.         controller: function($scope, $defaultOption){</span><span style="font-size:18px;">  
  9.             //這個(gè)地方是要把真實(shí)的值傳給option做渲染  
  10.             $scope.option = $defaultOption.removeDiff($defaultOption[$scope.ngType], $scope.myConfig);  
  11.         },  
  12.         templateUrl: 'select.html'  
  13.     };  
  14. });</span>  
[javascript] view plain copy
  1. <span style="font-size:18px;">  
  2.   
  3. //最后的最后再加一個(gè)模板,就完事兒了  
  4.   
  5. allInput.run(function($templateCache){  
  6.     $templateCache.put('select.html',  
  7.         ' \  
  8.         <select \  
  9.             ng-options = "key as value for (key, value) in option.data"> \  
  10.         </select> \  
  11.         '  
  12.     );  
  13. });</span>  
[javascript] view plain copy
  1. <span style="font-size:18px;">引用實(shí)例 <select-input ng-type = "status"  ng-model = "xxx" /></span>  


做到這個(gè)地方,基本上我們我們一個(gè)select 控件就完成了, 是不是特別的簡單,想一想,每次只要添加一個(gè)factory就可以用一行代碼來創(chuàng)建一個(gè)下拉框。反正我覺得真的是大大提高了工作效率。


5. 創(chuàng)建一個(gè)統(tǒng)一的radio控件

[javascript] view plain copy
  1. <span style="font-size:18px;">// 這個(gè)要提前寫,寫這個(gè)控件的時(shí)候,我真的遇到了不少麻煩,所以只能進(jìn)行一丟丟的dom操作,還希望哪個(gè)厲害的大哥可以指點(diǎn)我一下  
  2. //然后開始擼代碼  
  3. allInput.directive('radioInput', function($defaultOption){  
  4.     return {  
  5.         restrict: 'AE',  
  6.         replace: true,  
  7.         scope: {  
  8.             ngType: '@',  //這倆跟上面一樣  
  9.             myConfig: '='  
  10.         },  
  11.         //這個(gè)地方因?yàn)槭菍慸emo,我是犯個(gè)懶,用之前select的  
  12.         controller: function($scope, $defaultOption){  
  13.             $scope.option = $defaultOption.removeDiff($defaultOption[$scope.ngType], $scope.myConfig);  
  14.         },  
  15.         templateUrl: 'radio.html'  
  16.     };  
  17. });  
  18.   
  19. //這里也寫一個(gè)模板  
  20. allInput.run(function($templateCache){  
  21.     //這個(gè)地方是我最頭疼的,因?yàn)椴荒芡絥g-model,所以我寫了一個(gè)指令來進(jìn)行dom操作  
  22.     $templateCache.put('radio.html',   
  23.         '<input ng-repeat = "(key, value) in option.data" radio-to-name type = "radio" value = "{{key}}" radio-value = "{{value}}">'  
  24.     );  
  25. });  
  26.   
  27. //這個(gè)地方就是重點(diǎn),我目前為止還不知道怎么處理,所以只能寫一個(gè)dom來操作,有大神可以指點(diǎn)我,呵呵  
  28. allInput.directive('radioToName', function(){  
  29.     return {  
  30.         restrict: 'A',  
  31.         terminal: true, //這個(gè)地方指定優(yōu)先級(jí)最低,要讓ng-repeat指令完成之后才可以執(zhí)行  
  32.         link: function(scope, ele, attr){  
  33.             ele.after('' + attr.radioValue + '');  
  34.         }  
  35.     };  
  36. });</span>  


三 實(shí)踐效果與坑

1. 實(shí)踐效果

到了這一步,基本上沒什么好講的了,大家就可以放開了用了,下面寫幾個(gè)應(yīng)用實(shí)例

  1.   

效果預(yù)覽:http://4.pandaliu.sinaapp.com/

代碼:https://github.com/sd142400/angular-input


2. 坑

基本上上面的代碼沒有看什么資料,完全就是按照之前我做項(xiàng)目的經(jīng)驗(yàn)手打了一遍,但是在用的時(shí)候大概出現(xiàn)了以下幾個(gè)坑

2.1 ng-options 這種命令,需要添加ng-model才可以生效

2.2 radio 這個(gè)控件,如果是直接$scope.xxx這個(gè)作用域會(huì)變成子作用域下,所以要用$scope.model.xxx來解決這個(gè)問題。當(dāng)然,model也可以換成別的什么


以上就是我的一些經(jīng)驗(yàn),歡迎大神來指正。這篇文章是上周日寫的,寫到最后調(diào)試不了,我就去跑了10公里,回來就睡覺了。結(jié)果本周忙的要死,今天才抽出空來把這些代碼搞定。但是當(dāng)時(shí)遇到的一些坑確實(shí)忘記了一點(diǎn),以后會(huì)補(bǔ)充進(jìn)來。






本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Jquery EasyUi實(shí)戰(zhàn)教程布局篇
通過按鈕執(zhí)行對應(yīng)操作完成javascript檢測
實(shí)現(xiàn)字體大中小的另一種方法
5. li的浮動(dòng)間距(同img的上下空隙相同) (親測)
很全的教育學(xué)習(xí)資料匯總
bShare提供了自定義分享內(nèi)容
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服