精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

七步從AngularJS菜鳥到專家(6):服務

開發 后端 前端
這是"AngularJS – 七步從菜鳥到專家"系列的第六篇。在這一章,我們來討論services,整理我們的代碼并完成我們的音頻播放器應用。

這是"AngularJS – 七步從菜鳥到專家"系列的第六篇。

在第一篇,我們展示了如何開始搭建一個AngularaJS應用。在第五篇我們討論了Angular內建的directives。在這一章,我們來討論services,整理我們的代碼并完成我們的音頻播放器應用。

通過這整個系列的教程,我們會開發一個NPR(美國全國公共廣播電臺)廣播的音頻播放器,它能顯示Morning Edition節目里現在播出的最新故事,并在我們的瀏覽器里播放。完成版的Demo可以看看這里。

目前為止,我們把注意力都放在了如何把視圖綁定到$scope和如何用controller管理數據,從內存和效率角度出 發,controllers僅當需要的時候才會被實例化并在不需要的時候被丟棄掉,這就意味著每一次我們使用route跳轉或者重載視圖(我們會在下一篇 討論routing),當前的controller會被銷毀。

Services可以讓我們在整個應用的生命周期中保存數據并且可以讓controllers之間共享數據。

第六部分:Services

Services都是單例的,就是說在一個應用中,每一個Serice對象只會被實例化一次(用$injector服務),主要負責提供一個接口把 特定函數需要的方法放在一起,我們就拿上一章見過的$http Service來舉例,他就提供了訪問底層瀏覽器的XMLHttpRequest對象的方法,相較于調用底層的XMLHttpRequest對 象,$http API使用起來相當的簡單。

Angular內建了很多服務供我們日常使用,這些服務對于在復雜應用中建立自己的Services都是相當有用的。

AngularJS讓我們可以輕松的創建自己的services,僅僅注冊service即可,一旦注冊,Angular編譯器就可以找到并加載他作為依賴供程序運行時使用,

最常見的創建方法就是用angular.module API 的factory模式

  1. angular.module('myApp.services', []) 
  2.   .factory('githubService', function() { 
  3.     var serviceInstance = {}; 
  4.     // 我們的第一個服務 
  5.     return serviceInstance; 
  6.   }); 

當然,我們也可以使用內建的$provide service來創建service。

這個服務并沒有做實際的事情,但是他向我們展示了如何去定義一個service。創建一個service就是簡單的返回一個函數,這個函數返回一個對象。這個對象是在創建應用實例的時候創建的(記住,這個對象是單例對象)

我們可以在這個縱貫整個應用的單例對象里處理特定的需求,在上面的例子中,我們開始創建了GitHub service,

接下來讓我們添加一些有實際意義的代碼去調用GitHub的API:

  1. angular.module('myApp.services', []) 
  2.   .factory('githubService', ['$http', function($http) { 
  3.   
  4.     var doRequest = function(username, path) { 
  5.       return $http({ 
  6.         method: 'JSONP', 
  7.         url: 'https://api.github.com/users/' + username + '/' + path + '?callback=JSON_CALLBACK
  8.       }); 
  9.     } 
  10.     return { 
  11.       events: function(username) { return doRequest(username, 'events'); }, 
  12.     }; 
  13.   }]); 

我們創建了一個只有一個方法的GitHub Service,events可以獲取到給定的GitHub用戶最新的GitHub事件,為了把這個服務添加到我們的controller中。我們建立一 個controller并加載(或者注入)githubService作為運行時依賴,我們把service的名字作為參數傳遞給controller 函數(使用中括號[])

  1. app.controller('ServiceController', ['$scope', 'githubService', 
  2.     function($scope, githubService) { 
  3. }]); 

請注意,這種依賴注入的寫法對于js壓縮是安全的,我們會在以后的章節中深入導論這件事情。

我們的githubService注入到我們的ServiceController后,我們就可以像使用其他服務(我們前面提到的$http服務)一樣的使用githubService了。

我們來修改一下我們的示例代碼,對于我們視圖中給出的GitHub用戶名,調用GitHub API,就像我們在數據綁定第三章節看到的,我們綁定username屬性到視圖中

  1. <div ng-controller="ServiceController"> 
  2.   <label for="username">Type in a GitHub username</label> 
  3.   <input type="text" ng-model="username" placeholder="Enter a GitHub username, like auser" /> 
  4.   <pre ng-show="username">{{ events }}</pre> 
  5. </div> 

現在我們可以監視 $scope.username屬性,基于雙向數據綁定,只要我們修改了視圖,對應的model數據也會修改

  1. app.controller('ServiceController', ['$scope', 'githubService', 
  2.     function($scope, githubService) { 
  3.     // Watch for changes on the username property. 
  4.     // If there is a change, run the function 
  5.     $scope.$watch('username', function(newUsername) { 
  6.             // uses the $http service to call the GitHub API 
  7.             // and returns the resulting promise 
  8.       githubService.events(newUsername) 
  9.         .success(function(data, status, headers) { 
  10.                     // the success function wraps the response in data 
  11.                     // so we need to call data.data to fetch the raw data 
  12.           $scope.events = data.data; 
  13.         }) 
  14.     }); 
  15. }]); 

因為返回了$http promise(像我們上一章一樣),我們可以像直接調用$http service一樣的去調用.success方法

 

 

(示例截圖,請前往原文測試)

 #p#

在這個示例中,我們注意到輸入框內容改變前有一些延遲,如果我們不設置延遲,那么我們就會對鍵入輸入框的每一個字符調用GitHub API,這并不是我們想要的,我們可以使用內建的$timeout服務來實現這種延遲。

如果想使用$timeout服務,我們只要簡單的把他注入到我們的githubService中就可以了

  1. app.controller('ServiceController', ['$scope', '$timeout', 'githubService', 
  2.     function($scope, $timeout, githubService) { 
  3. }]); 

注意我們要遵守Angular services依賴注入的規范:自定義的service要寫在內建的Angular services之后,自定義的service之間是沒有先后順序的。

我們現在就可以使用$timeout服務了,在本例中,在輸入框內容的改變間隔如果沒有超過350毫秒,$timeout service不會發送任何網絡請求。換句話說,如果在鍵盤輸入時超過350毫秒,我們就假定用戶已經完成輸入,我們就可以開始向GitHub發送請求

  1. app.controller('ServiceController', ['$scope', '$timeout', 'githubService', 
  2.   function($scope, $timeout, githubService) { 
  3.     // The same example as above, plus the $timeout service 
  4.     var timeout; 
  5.     $scope.$watch('username', function(newVal) { 
  6.       if (newVal) { 
  7.         if (timeout) $timeout.cancel(timeout); 
  8.         timeout = $timeout(function() { 
  9.           githubService.events(newVal) 
  10.           .success(function(data, status) { 
  11.             $scope.events = data.data; 
  12.           }); 
  13.         }, 350); 
  14.       } 
  15.     }); 
  16.   }]); 

從這應用開始,我們只看到了Services是如何把簡單的功能整合在一起,Services還可以在多個controllers之間共享數據。比 如,如果我們的應用有一個設置頁面供用戶設置他們的GitHub username,那么我們就要需要把username與其他controllers共享。

這個系列的最后一章我們會討論路由以及如何在多頁面中跳轉。

為了在controllers之間共享username,我們需要在service中存儲username,記住,在應用的生命周期中Service是一直存在的,所以可以把username安全的存儲在這里

  1. angular.module('myApp.services', []) 
  2.   .factory('githubService', ['$http', function($http) { 
  3.     var githubUsername; 
  4.     var doRequest = function(path) { 
  5.       return $http({ 
  6.         method: 'JSONP', 
  7.         url: 'https://api.github.com/users/' + githubUsername + '/' + path + '?callback=JSON_CALLBACK
  8.       }); 
  9.     } 
  10.     return { 
  11.       events: function() { return doRequest('events'); }, 
  12.       setUsername: function(newUsername) { githubUsername = newUsername; } 
  13.     }; 
  14.   }]); 

現在,我們的service中有了setUsername方法,方便我們設置GitHub用戶名,在應用的任何controller中,我們都可以調用events()方法,而根本不用操心在scope對象中的username設置是否正確。

我們應用里的Services

在我們的應用里,我們需要為3個元素創建對應的服務:audio元素,player元素,nprService。最簡單的就是audio service,切記,不要在controller中有任何的操控DOM的行為,如果這么做會污染你的controller并留下潛在的隱患。

在我們的應用中,PlayerController中有一個audio element元素的實例

  1. app.controller('PlayerController', ['$scope', '$http', 
  2.   function($scope, $http) { 
  3.   var audio = document.createElement('audio'); 
  4.   $scope.audio = audio; 
  5.   // ... 

我們可以建立一個單例audio service,而不是在controller中設置audio元素

  1. app.factory('audio', ['$document', function($document) { 
  2.   var audio = $document[0].createElement('audio'); 
  3.   return audio; 
  4. }]); 

注意:我們使用了另一個內建服務$document服務,這個服務就是window.document元素(所有html頁面里javascript的根對象)的引用。

現在,在我們的PlayController中我們可以引用這個audio元素,而不是在controller中建立這個audio元素

  1. app.controller('PlayerController', ['$scope', '$http', 'audio', 
  2.   function($scope, $http, audio) { 
  3.   $scope.audio = audio; 

盡管看起來我們并沒有增強代碼的功能或者讓代碼更加清晰,但是如果有一天,PlayerController不再需要audio service了,我們只需要簡單刪除這個依賴就可以了。到那個時候你就能切身體會到這種代碼寫法的妙處了!

注意:現在我們可以在其他應用中共享audio service了,因為他并沒有綁定特定于本應用的功能

為了看到效果,我們來建立下一個服務: player service,在我們的當前循環中,我們附加了play()和stop()方法到PlayController中。這些方法只跟playing audio有關,所以并沒有必要綁定到PlayController,總之,使用PlayController調用player service API來操作播放器,而并不需要知道操作細節是最好不過的了。

讓我們來創建player service,我們需要注入我們剛剛創建的還熱乎的audio service 到 player service

  1. app.factory('player', ['audio', function(audio) { 
  2.   var player = {}; 
  3.   return player; 
  4. }]); 

現在我們可以把原先定義在PlayerController中play()方法挪到player service中了,我們還需要添加stop方法并存儲播放器狀態。

  1. app.factory('player', ['audio', function(audio) { 
  2.   var player = { 
  3.     playing: false, 
  4.     current: null, 
  5.     ready: false, 
  6.   
  7.     play: function(program) { 
  8.       // If we are playing, stop the current playback 
  9.       if (player.playing) player.stop(); 
  10.       var url = program.audio[0].format.mp4.$text; // from the npr API 
  11.       player.current = program; // Store the current program 
  12.       audio.src = url
  13.       audio.play(); // Start playback of the url 
  14.       player.playing = true 
  15.     }, 
  16.   
  17.     stop: function() { 
  18.       if (player.playing) { 
  19.         audio.pause(); // stop playback 
  20.         // Clear the state of the player 
  21.         playerplayer.ready = player.playing = false
  22.         player.current = null
  23.       } 
  24.     } 
  25.   }; 
  26.   return player; 
  27. }]);

#p#

現在我們已經擁有功能完善的play() and stop()方法,我們不需要使用PlayerController來管理跟播放相關的操作,只需要把控制權交給PlayController里的player service即可

  1. app.controller('PlayerController', ['$scope', 'player', 
  2.   function($scope, player) { 
  3.   $scope.player = player; 
  4. }]); 

(注:示例截圖,請到原文測試)

注意:使用player service的時候,我們不需要去考慮audio service,因為player會幫我們處理audio service。

注意:當audio播放結束,我們沒有重置播放器的狀態,播放器會認為他自己一直在播放

為了解決這個問題,我們需要使用$rootScope服務(另一個Angular的內建服務)來捕獲audio元素的ended事件,我們注入$rootScope服務并創建audio元素的事件監聽器

  1. app.factory('player', ['audio', '$rootScope', 
  2.   function(audio, $rootScope) { 
  3.   var player = { 
  4.     playing: false, 
  5.     ready: true, 
  6.     // ... 
  7.   }; 
  8.   audio.addEventListener('ended', function() { 
  9.     $rootScope.$apply(player.stop()); 
  10.   }); 
  11.   return player; 
  12. }]); 

在這種情況下,為了需要捕獲事件而使用了$rootScope service,注意我們調用了$rootScope.$apply()。 因為ended事件會觸發外圍Angular event loop.我們會在后續的文章中討論event loop。

最后,我們可以獲取當前播放節目的詳細信息,比如,我們創建一個方法獲取當前事件和當前audio的播放間隔(我們會用這個參數顯示當前的播放進度)。

  1. app.factory('player', ['audio', '$rootScope', 
  2.   function(audio, $rootScope) { 
  3.   var player = { 
  4.     playing: false, 
  5.     // ... 
  6.     currentTime: function() { 
  7.       return audio.currentTime; 
  8.     }, 
  9.     currentDuration: function() { 
  10.       return parseInt(audio.duration); 
  11.     } 
  12.   } 
  13.   }; 
  14.   return player; 
  15. }]); 

在audio元素中存在timeupdate事件,我們可以根據這個事件更新播放進度

  1. audio.addEventListener('timeupdate', function(evt) { 
  2.     $rootScope.$apply(function() { 
  3.       playerplayer.progress = player.currentTime(); 
  4.       playerplayer.progress_percent = player.progress / player.currentDuration(); 
  5.     }); 
  6.   }); 

最后,我們一個添加canplay事件來表示視圖中的audio是否準備就緒

  1. app.factory('player', ['audio', '$rootScope', 
  2.   function(audio, $rootScope) { 
  3.   var player = { 
  4.     playing: false, 
  5.     ready: false, 
  6.     // ... 
  7.   } 
  8.   audio.addEventListener('canplay', function(evt) { 
  9.     $rootScope.$apply(function() { 
  10.       player.ready = true
  11.     }); 
  12.   }); 
  13.   return player; 
  14. }]); 

現在,我們有了player service,我們需要操作nprLink directive 來讓播放器 ’play’,而不是用$scope(注意,這么做是可選的,我們也可以在PlayerController中創建play()和stop()方法)

在directive中,我們需要引用本地scope的player,代碼如下:

  1. app.directive('nprLink', function() { 
  2.   return { 
  3.     restrict: 'EA', 
  4.     require: ['^ngModel'], 
  5.     replace: true, 
  6.     scope: { 
  7.       ngModel: '=', 
  8.       player: '=' 
  9.     }, 
  10.     templateUrl: '/code/views/nprListItem', 
  11.     link: function(scope, ele, attr) { 
  12.       scopescope.duration = scope.ngModel.audio[0].duration.$text; 
  13.     } 
  14.   } 
  15. }); 

現在,為了跟我們已有的模板整合,我們需要更新 index.html的npr-link調用方式

  1. <npr-link ng-model="program" player="player"></npr-link> 

在視圖界面,我們調用play.play(ngModel),而不是play(ngModel).

  1. <div class="nprLink row" player="player" ng-click="player.play(ngModel)"> 
  2.   <span class="name large-8 columns"> 
  3.     <button class="large-2 small-2 playButton columns" ng-click="ngModel.play(ngModel)"><div class="triangle"></div></button> 
  4.     <div class="large-10 small-10 columns"> 
  5.       <div class="row"> 
  6.         <span class="large-12">{{ ngModel.title.$text }}</span> 
  7.       </div> 
  8.       <div class="row"> 
  9.         <div class="small-1 columns"></div> 
  10.         <div class="small-2 columns push-8"><a href="{{ ngModel.link[0].$text }}">Link</a></div> 
  11.       </div> 
  12.     </div> 
  13.   </span> 
  14. </div> 

#p#

邏輯上,我們需要添加播放器視圖到總體視圖上,因為我們可以封裝player數據和狀態。查看playerView directive 和 template

我們來創建最后一個service,nprService,這個service很像 githubService,我們用$http service來獲取NPR的最新節目

  1. app.factory('nprService', ['$http', function($http) { 
  2.     var doRequest = function(apiKey) { 
  3.       return $http({ 
  4.         method: 'JSONP', 
  5.         url: nprUrl + '&apiKey=' + apiKey + '&callback=JSON_CALLBACK
  6.       }); 
  7.     } 
  8.   
  9.     return { 
  10.       programs: function(apiKey) { return doRequest(apiKey); } 
  11.     }; 
  12.   }]); 

在PlayerController,我們調用nprService的programs()(調用$http service)

  1. app.controller('PlayerController', ['$scope', 'nprService', 'player', 
  2.   function($scope, nprService, player) { 
  3.   $scope.player = player; 
  4.   nprService.programs(apiKey) 
  5.     .success(function(data, status) { 
  6.       $scope.programs = data.list.story; 
  7.     }); 
  8. }]); 

我們建議使用promises來簡化API,但是為了展示的目的,我們在下一個post會簡單介紹promises。

當PlayerController初始化后,我們的nprService會獲取最新節目,這樣我們在nprService service中就成功封裝了獲取NPR節目的功能。另外,我們添加RelatedController在側邊欄顯示當前播放節目的相關內容。當我們的 player service中獲取到最新節目時,我們將$watc這個player.current屬性并顯示跟這個屬性相關的內容。

  1. app.controller('RelatedController', ['$scope', 'player', 
  2.   function($scope, player) { 
  3.   $scope.player = player; 
  4.   
  5.   $scope.$watch('player.current', function(program) { 
  6.     if (program) { 
  7.       $scope.related = []; 
  8.       angular.forEach(program.relatedLink, function(link) { 
  9.         $scope.related.push({ 
  10.           link: link.link[0].$text, 
  11.           caption: link.caption.$text 
  12.         }); 
  13.       }); 
  14.     } 
  15.   }); 
  16. }]); 

在 HTML 代碼中, we just reference the related links like we did with our NPR programs, using the ng-repeat directive:

  1. <div class="large-4 small-4 columns" ng-controller="RelatedController"> 
  2.   <h2>Related content</h2> 
  3.   <ul id="related"> 
  4.     <li ng-repeat="s in related"><a href="{{ s.link }}">{{ s.caption }}</a></li> 
  5.   </ul> 
  6. </div> 

只要player.current內容改變,顯示的相關內容也會改變。

在下一章也是我們的“AngularJS – 七步從菜鳥到專家”的最后一章,我們會討論依賴注入,路由,和產品級別工具來讓我們更快的使用AngularJS

本系列的官方代碼庫可從github上下載:https://github.com/auser/ng-newsletter-beginner-series.

要將這個代碼庫保存到本地,請先確保安裝了git,clone此代碼庫,然后check out其中的part6分支:

  1. git clone https://github.com/auser/ng-newsletter-beginner-series.git 
  2. git checkout -b part6 
  3. ./bin/server.sh 

原文鏈接:http://www.ng-newsletter.com/posts/beginner2expert-services.html

譯文鏈接:http://blog.jobbole.com/49745/

責任編輯:陳四芳 來源: 伯樂在線
相關推薦

2013-10-29 14:57:17

AngularJS項目

2013-10-23 13:25:28

AngularJS應用

2013-11-06 10:10:15

AngularJSScopes

2013-08-28 14:12:02

Web前端開發前端

2013-10-08 11:25:57

AngularJSAJAX

2019-03-10 20:37:14

Python編程語言

2010-08-10 13:15:36

Flex配置

2010-05-28 10:10:49

2023-04-28 14:38:47

2009-12-24 10:49:46

2009-11-06 14:33:27

WCF代理節點

2011-01-06 09:15:24

ESXESXi

2009-07-30 18:08:14

IT與業務融合

2017-04-21 14:21:53

深度學習神經網絡

2009-11-06 13:59:09

WCF Service

2023-01-12 07:57:26

2011-07-18 16:11:32

域控制器

2011-09-05 17:36:24

2010-05-12 15:02:41

Subversion服Ubuntu

2018-02-24 18:12:30

點贊
收藏

51CTO技術棧公眾號

久久影院一区二区| 国内av免费观看| www日韩tube| 国产综合色视频| 午夜精品久久久久久久99热| 国产吞精囗交久久久| 亚洲一区导航| 欧美丝袜一区二区| 成人黄色片免费| 男人天堂亚洲二区| 国产a视频精品免费观看| 日本免费久久高清视频| 欧美交换国产一区内射| 欧美军人男男激情gay| 欧美videossexotv100| 成年人在线观看视频免费| 黑人极品ⅴideos精品欧美棵| 欧美激情在线看| 国产欧美一区二区视频| 96日本xxxxxⅹxxx17| 欧美综合二区| 久久久久久久一| 秋霞欧美一区二区三区视频免费| 日韩激情啪啪| 精品不卡在线视频| 亚洲精品成人在线播放| 九九热线视频只有这里最精品| 亚洲一区二三区| 亚洲欧洲一区二区| 国产最新视频在线| 91亚洲精品久久久蜜桃网站| av电影成人| 国产精品久久久久久久一区二区 | 欧美xxxx18国产| 国产三级av在线播放| 久久久久久毛片免费看| 日韩久久久久久| 欧美日韩精品区别| 欧美一级免费| 欧美日韩午夜影院| 日本美女高潮视频| 日韩视频网站在线观看| 日本道免费精品一区二区三区| 日韩日韩日韩日韩日韩| 国产网红女主播精品视频| 日韩美女久久久| 伊人情人网综合| 九色porny丨首页在线| 国产精品高潮久久久久无| 丝袜美腿玉足3d专区一区| 黄色小视频在线免费观看| 91免费国产在线观看| 精品一区二区三区免费毛片| 色哟哟中文字幕| 99久久免费精品高清特色大片| 波多野结衣精品久久| 国产偷人妻精品一区二区在线| 精品一二线国产| 国产一区欧美二区三区| 国产孕妇孕交大片孕| 精品一区二区在线看| 亚洲精品免费网站| 亚洲AV无码精品色毛片浪潮| 成人精品国产一区二区4080| 好吊色欧美一区二区三区| 日韩一卡二卡在线| 久久精品夜夜夜夜久久| 色999日韩自偷自拍美女| www.中文字幕久久久| 亚洲欧洲成人自拍| 可以在线看黄的网站| 免费在线国产视频| 精品免费在线视频| 福利在线一区二区三区| 国产精品99久久免费| 欧美一级欧美三级在线观看| 欧美xxxx日本和非洲| 久久97久久97精品免视看秋霞| 亚洲国产精久久久久久 | www久久久com| jiyouzz国产精品久久| 欧美一区2区三区4区公司二百| 成人一区二区不卡免费| 亚洲免费色视频| 黄色一级片在线看| 嫩草伊人久久精品少妇av杨幂| 欧美日韩国产高清一区二区 | 中文字幕一二三四| 国产福利一区二区三区视频| 久久久精品动漫| 日本成a人片在线观看| 亚洲国产wwwccc36天堂| 日本www高清视频| 国产一区一区| 亚洲欧美成人网| 美国黄色小视频| 午夜在线播放视频欧美| 国产欧美欧洲在线观看| 懂色av一区二区三区四区| 国产三级精品视频| 性高湖久久久久久久久aaaaa| 欧美三区四区| 精品成a人在线观看| jizz日本在线播放| 99成人精品| 亚洲a区在线视频| 国产中文字幕在线播放| 亚洲午夜激情av| 亚洲天堂网2018| 亚洲区小说区| 欧美极品在线播放| 国产尤物在线观看| 久久久久九九视频| 黄色大片中文字幕| 91麻豆精品| 亚洲人成网在线播放| 精品无码人妻一区二区三区品 | 美女搡bbb又爽又猛又黄www| 日韩黄色大片网站| 日本中文字幕久久看| 好吊色一区二区三区| 国产精品国产三级国产a| 99re在线视频免费观看| aaa国产精品视频| 久久中文字幕在线| 亚洲视频在线观看免费视频| 久久一二三国产| 青青青免费在线| 999国产精品一区| www.日韩欧美| 伊人影院中文字幕| 国产精品天干天干在观线| 国产精品免费入口| 欧美黑人巨大videos精品| 欧美国产日韩视频| 亚洲国产精品久久人人爱潘金莲| 综合久久综合久久| 17c国产在线| 99久久亚洲精品蜜臀| 国产精品影院在线观看| 国产精品久久一区二区三区不卡| 欧美性猛交xxxx乱大交蜜桃| 特级西西人体wwwww| 一区久久精品| 国产私拍一区| 欧美裸体视频| 日韩精品免费视频| 久久精品视频5| 国产日韩高清在线| 色哟哟精品视频| 日韩国产综合| 91视频-88av| 在线免费观看污| 欧美一卡二卡三卡四卡| 国内偷拍精品视频| 风间由美性色一区二区三区| 全黄性性激高免费视频| 欧美综合自拍| 国产99久久精品一区二区永久免费 | 美女主播视频一区| 欧美性xxx| 中文字幕日韩高清| 国产又粗又猛又爽又黄的视频一| ...中文天堂在线一区| 免费看的av网站| 精品91在线| 青青成人在线| 国产95亚洲| 久久久久久久久国产精品| 午夜视频免费看| 欧美日韩国产区一| 免费在线看黄网址| 久久综合久久综合久久综合| 久久精品影视大全| 欧美日韩国内| 欧美h视频在线| 亚洲精品一区二区在线播放∴| 欧美乱妇40p| 日本天堂在线| 91麻豆精品国产自产在线| 国产在线观看99| 国产无人区一区二区三区| 日韩欧美理论片| 国产欧美精品| 欧美日韩在线免费观看视频| 加勒比色老久久爱综合网| 国产精品欧美久久久| 日本乱理伦在线| 亚洲香蕉伊综合在人在线视看| 国产精品久久777777换脸| 红桃av永久久久| 国产喷水在线观看| 99久久久久久99| 亚洲三级在线观看视频| 亚洲欧美春色| 路边理发店露脸熟妇泻火| 蜜桃成人av| 97se亚洲综合| 成人h在线观看| 97视频在线观看成人| 麻豆网站在线| 国产丝袜一区二区三区免费视频| 国产一区二区三区黄片| 欧美视频中文在线看| 成年人一级黄色片| 国产欧美日韩另类一区| 国产人妖在线观看| 另类欧美日韩国产在线| 国产aaa一级片| 激情欧美亚洲| 中国一级黄色录像| 成人羞羞视频播放网站| 久久精品国产理论片免费| 精品欧美视频| 国产噜噜噜噜噜久久久久久久久 | 精品日韩中文字幕| avove在线播放| 亚洲欧洲日产国产综合网| 一级在线观看视频| 久久九九久精品国产免费直播| 在线观看你懂的视频| 精品一二三四在线| 欧美美女一级片| 日韩av午夜在线观看| 99福利在线观看| 99国产精品| 男人添女人下部高潮视频在观看| 亚洲精品成人无限看| 亚洲欧美成人一区| 欧美综合另类| 水蜜桃一区二区| 欧美艳星介绍134位艳星| 欧美日韩高清免费| 一区二区美女| 欧美激情论坛| 亚洲精品aaaaa| 久久99欧美| 欧美人与动xxxxz0oz| 国产精品我不卡| 国产女人18毛片水真多18精品| 成人欧美一区二区三区视频xxx| 久久伦理中文字幕| 超碰97人人人人人蜜桃| 9国产精品午夜| 国产一区视频观看| 日韩三级视频| 欧美在线3区| 欧美理论视频| 中文字幕久精品免| 欧美一区二区三区久久精品茉莉花| 一区二区精品在线| 中文字幕一区二区三区久久网站| 一区二区在线观| 欧美fxxxxxx另类| 欧美视频在线观看视频| 中国女人久久久| 成人精品视频一区二区| 免费看日韩精品| 五月天国产视频| 波多野结衣亚洲一区| 三级黄色片网站| 欧美激情综合网| 97成人资源站| 欧美日韩国产一中文字不卡 | 九色porny丨首页入口在线| 2019av中文字幕| 成人不卡视频| 产国精品偷在线| 国产精品亚洲片在线播放| 五月天亚洲综合小说网| 欧美一区亚洲| 亚洲 自拍 另类小说综合图区| 欧美专区18| 国产乱叫456| 国产污视频在线播放| 亚洲最大在线| 秋霞毛片久久久久久久久| 第四色成人网| 精品一二三四五区| 男女精品网站| 亚洲一二三av| 久久综合色婷婷| 三级黄色片在线观看| 一区二区三区四区亚洲| 亚洲 欧美 日韩 综合| 欧美日韩激情一区| 蜜桃av中文字幕| 中文字幕亚洲一区二区三区| 亚洲国产精品精华素| 国产成人精品久久亚洲高清不卡| 成人免费91| 欧美综合激情| 黄色精品免费| 四季av一区二区三区| caoporn国产精品| 久久久久久久久久97| 精品福利樱桃av导航| 国产日本精品视频| 亚洲网站在线看| 色婷婷视频在线观看| 国产精品亚洲网站| 日韩丝袜视频| 男人的天堂avav| 日本va欧美va瓶| 在线观看免费视频黄| 国产精品初高中害羞小美女文| 五月天婷婷综合网| 欧美一级夜夜爽| 1024视频在线| 国产精品 欧美在线| 欧美精品中文字幕亚洲专区| 超碰超碰超碰超碰超碰| 久久精品国产精品亚洲精品 | 久久精品亚洲精品国产欧美| 精品99在线观看| 91.成人天堂一区| av在线1区2区| 国产91九色视频| 日韩av中文字幕一区| 日韩精品免费一区| 国产一区视频导航| 人人干在线观看| 欧美三级视频在线| 韩日视频在线| 日本国产高清不卡| 亚洲第一福利专区| 黄色av网址在线播放| 粉嫩aⅴ一区二区三区四区| 麻豆天美蜜桃91| 欧美美女激情18p| 麻豆电影在线播放| 国产综合福利在线| 99久久婷婷这里只有精品| 日韩av卡一卡二| 中文字幕在线一区| 国产精品污视频| 久久久国产91| 精品国产一区二区三区性色av| 正在播放91九色| 韩国成人精品a∨在线观看| 国产人与禽zoz0性伦| 欧美剧情片在线观看| 男人天堂手机在线| 成人免费观看网址| 欧美日韩免费| 五月天丁香社区| 亚洲 欧美综合在线网络| 黄色av一区二区三区| 亚州欧美日韩中文视频| 奇米777国产一区国产二区| 欧美视频第一区| 国产精品拍天天在线| 中文字字幕在线中文乱码| 久久久国产成人精品| 亚洲日本va午夜在线电影| 日本a在线天堂| 99精品视频在线播放观看| 久久精品无码av| 在线观看亚洲视频| 国产精品国产三级在线观看| 久草视频这里只有精品| www.日韩av| 超碰在线免费97| 欧美不卡视频一区发布| 国产香蕉精品| 成人亚洲视频在线观看| 国产精品成人免费| 亚洲精品国产手机| 欧美亚洲国产视频| 99精品视频在线观看播放| 亚洲妇女无套内射精| 精品高清一区二区三区| 福利片在线看| 99理论电影网| 日本中文在线一区| 欧美精品一区二区成人| 亚洲男人天堂视频| 精品视频成人| 欧洲av无码放荡人妇网站| 国产精品拍天天在线| 全国男人的天堂网| 国产精品视频久久久久| 黄色一区二区三区四区| 影音先锋制服丝袜| 精品久久久久久综合日本欧美| 日本美女一区| 日韩国产小视频| 国产精品丝袜一区| 日本美女一级视频| 国产日韩在线一区| 亚洲女同同性videoxma| 国产探花在线免费观看| 亚洲天堂第一页| 国产精品网在线观看| 色呦色呦色精品| 黑人精品xxx一区一二区| 黄黄的网站在线观看| 欧美一区国产一区| 国产91丝袜在线播放九色| 中文字幕 欧美激情|