日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]

發布時間:2024/9/21 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 4、Angular JS 学习笔记 – 创建自定义指令 [翻译中] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

創建自定義指令

注意:本指南是針對已經熟悉AngularJS基礎的開發者。如果您只是想要開始,建議您先去看教程。如果你在尋找指令的API,我們最近把他移動到 $compile

這個文檔解釋當我們想要在AngularJS 應用中建立自己的指令時,該如何實現。

什么是指令?

從一個高的層次看,指令是DOM元素(屬性、元素名稱、注釋、或CSS樣式類)上的標記告訴AngularJS的HTML 編譯器($compile)去附加特定的行為到DOM元素或者是變換DOM元素和它的子元素。

Angular 內置了一個指令集,比如ngBind,ngModel,和ngClass。非常像是你創建一個Controllers和Services,你可以創建自己的指令用于Angular。當Angular窮的那個你的應用,HTML編譯器通過DOM匹配指令。

“編譯”HTML模板是什么意思??對于AngularJS, "編譯" 表示附加事件到HTML上建立交互效果。我們使用“編譯”這個術語的原因是指令的遞歸處理借鑒了編譯程序語言編譯源代碼的過程。

匹配指令

我們寫一個指令前,我們需要知道Angular的HTML編譯器決定何時使用給定的指令。

在下面的例子中,我們說這個<input>元素匹配ngModel指令。

<input ng-model="foo">

下面的代碼也匹配ngModel:

<input data-ng:model="foo">

標準化

Angular標準化一個元素的標簽和屬性名稱去確定一個元素匹配哪個指令。我們通常引用指令通過區分大寫小的駝峰標準名稱(例如 ngModel)。不過,HTML是不區分大小寫的,我們在DOM上引用指令通過小寫方式,通常在元素上使用中劃線分割屬性名(例如 ng-model)。

標準化的過程如下:

  • 從元素或者屬性去除x-和data-前綴
  • 轉換帶有分隔符?:, -,或?_?的名稱為駝峰格式:
  • 舉例來說,下面的方式是相同的都匹配ngBind指令。

    <div ng-controller="Controller">Hello <input ng-model='name'> <hr/><span ng-bind="name"></span> <br/><span ng:bind="name"></span> <br/><span ng_bind="name"></span> <br/><span data-ng-bind="name"></span> <br/><span x-ng-bind="name"></span> <br/> </div> angular.module('docsBindExample', []) .controller('Controller', ['$scope', function($scope) {$scope.name = 'Max Karl Ernst Ludwig Planck (April 23, 1858 – October 4, 1947)'; }]); 最佳時間:?優先使用-分隔的格式。(例如 ng-bind?對應 ngBind)。如果你想使用HTML驗證工具,你可以替代使用data-為前綴的版本?(例如? data-ng-bind?對應 ngBind). 其他顯示在上面的形式出于兼容的原因也是支持的,不過我們建議你避免使用。

    指令的類型

    $compile可以在元素名稱,屬性,樣式類名稱,甚至是注釋上匹配指令。下面演示了不同方式的指令能夠在模板中引用:

    <my-dir></my-dir> <span my-dir="exp"></span> <!-- directive: my-dir exp --> <span class="my-dir: exp;"></span> 最佳實踐:?優先使用指令通過標簽名、屬性名,比注釋和class名要好。所以一般就簡單的提供一個元素匹配表示一個指令。 最佳實踐:注釋指令通常使用在DOM API 限制無法創建指令到多個元素的情況(例如內部的table元素)。AngularJS1.2 采用了ng-repeat-start 和 ng-repeat-end 更好的解決了這個問題。鼓勵開發者盡可能的去使用這個在自定義的注視指令上。

    文本和屬性的綁定

    在編譯處理過程中,編譯器使用$interpolate服務匹配文本和屬性、查看是否包含嵌套的表達式。這些表達式注冊為watches并且將局部更新作為普通編譯周期的一部分,一個插值例子展示在下面:

    <a ng-href="img/{{username}}.jpg">Hello {{username}}!</a>

    ngAttr?屬性綁定

    我們的瀏覽器有時候會更多的需要考慮有效的屬性。

    舉例,就這個模板而言:

    <svg><circle cx="{{cx}}"></circle> </svg>

    我們大概期望Angular能夠綁定,但是當我們檢查控制臺看到的類似于Errlr:Invalid value for attribute cx ="{{cx}}"。因為SVG DOM API 的約束,你不能簡單的寫作cx="{{cx}}"

    用ng-attr-cx你可以繞過這個問題。

    如果綁定的屬性前綴是ngAttr(標準化之前的是ng-attr-),則在綁定過程中它將應用于相應的沒有前綴的屬性。這允許你綁定到屬性,否則瀏覽器會著急的處理它(例如一個SVG元素的cricle[cx]屬性)。當使用ngAttr,$interpolate的allOrNothing標記已經在使用,所以如果任何的表達式在插值字符串結果是undefined,則這個屬性將會移除不會添加到元素。

    舉例子,我們可以修復上面的例子,寫為:

    <svg> <circle ng-attr-cx="{{cx}}"></circle> </svg>

    如果你想要修改一個駝峰命名的屬性(SVG元素具有有效的駝峰命名的屬性),比如viewBox屬性在svg元素,你可以使用下下劃線去表示這個屬性去綁定駝峰命名。

    舉例,去綁定viewBox,我們可以寫成:

    <svg ng-attr-view_box="{{viewBox}}"> </svg>

    創建指令

    首先讓我們說一下關于注冊指令的API。非常像是控制器,指令也是注冊在模塊上。去注冊一個指令,你使用module.directive API,module.directive需要一個標準的指令名稱在工廠函數中。這個工廠函數應該返回一個基于不同選項的對象告訴$compile 當指令有匹配的時候如何做。

    這個工廠函數在編譯器第一次匹配指令的時候執行。你可以在這里執行任何的初始化工作。這個函數使用$injector.invoke執行使得它可以接受注入,類似于控制器。

    最佳實踐: Prefer using the definition object over returning a function.更好的是使用一個定義對象返回一個函數。

    我們將通過一些指令的通用的例子,深入的了解不同的選項和編譯過程。

    最佳實踐:為了避免某些未來的標準,最好給您的指令使用前綴。舉個例子來說,如果你創建一個<carousel>指令,你可能會在HTML7引入的相同的元素發生而問題。2到3個短的前綴工作的很好。同樣的,不要給自己的指令使用ng前綴或者你認為未來版本的angular可能會引起沖突的名稱。

    在下面的例子中,我們將使用前綴my(例如 myCustomer)。

    模板擴展指令

    假設你有一塊表示客戶信息的模板。這個模板在你的代碼中重復了多次。當你修改一個地方,你需要去修改其他地方的幾個。這是一個好機會使用一個指令去簡化你的模板。

    Let's create a directive that simply replaces its contents with a static template:

    讓我們創建一個靜態的模板上的指令,簡單的替換它的內容:

    angular.module('docsSimpleDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.customer = {name: 'Naomi',address: '1600 Amphitheatre'}; }]) .directive('myCustomer', function() {return {template: 'Name: {{customer.name}} Address: {{customer.address}}'}; }); <div ng-controller="Controller"><div my-customer></div> </div>

    Notice that we have bindings in this directive. After $compile compiles and links <div my-customer></div>, it will try to match directives on the element's children. This means you can compose directives of other directives. We'll see how to do that in an example below.

    注意這樣我們就做了指令的綁定。$comple編譯和鏈接<div my-customer></div>之后,它將嘗試去匹配指令到元素的子元素。這意味著你可以將多個指令組合起來。下我們將看到如何去做。

    In the example above we in-lined the value of the template option, but this will become annoying as the size of your template grows.

    在上面的例子中,我們將template選項的值寫在了一行之中,但是這是我們為了使沉長的模板尺寸更好看。

    最佳實踐: Unless your template is very small, it's typically better to break it apart into its own HTML file and load it with the templateUrl option.除非你的模板很小,它通常最好拆分成幾個HTML文件并且使用templateUrl屬性來讀取。

    If you are familiar with ngInclude, templateUrl works just like it. Here's the same example using templateUrl instead:

    如果你見過ngInclude,templateUrl的工作就和它是一樣的。這里有一個相同的例子,使用templateUrl替代演示:

    angular.module('docsTemplateUrlDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.customer = {name: 'Naomi',address: '1600 Amphitheatre'}; }]) .directive('myCustomer', function() {return {templateUrl: 'my-customer.html'}; }); <div ng-controller="Controller"><div my-customer></div> </div>

    templateUrl can also be a function which returns the URL of an HTML template to be loaded and used for the directive. Angular will call the templateUrl function with two parameters: the element that the directive was called on, and an attr object associated with that element.

    templateUrl 也可以是一個函數來返回HTML模板的url,用來讀取模板并且用于指令。Angular將調用templateUrl函數基于兩個參數,一個是指令是在哪個元素上被調用,和一個attr屬性關聯相關的元素。

    注意: You do not currently have the ability to access scope variables from the templateUrl function, since the template is requested before the scope is initialized. 你沒有能力從templateUrl函數中訪問scope中的變量,因為這個模板是在作用域初始化完畢前加載的。 angular.module('docsTemplateUrlDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.customer = {name: 'Naomi',address: '1600 Amphitheatre'}; }]) .directive('myCustomer', function() {return {templateUrl: function(elem, attr){return 'customer-'+attr.type+'.html';}}; }); <div ng-controller="Controller"><div my-customer type="name"></div><div my-customer type="address"></div> </div> Name: {{customer.name}} Address: {{customer.address}} 注意: When you create a directive, it is restricted to attribute and elements only by default. In order to create directives that are triggered by class name, you need to use the restrict option.當你創建一個指令,它將默認受限于屬性和元素。為了創建指令將會根據class name觸發,你必須使用restrict組合。

    The restrict option is typically set to:

    這些約束的選項通常有:

    • 'A' - only matches attribute name
    • A - 值匹配屬性名
    • 'E' - only matches element name
    • E - 只匹配元素名稱
    • 'C' - only matches class name
    • C - 只匹配css類名

    These restrictions can all be combined as needed: 這些限制可以全部合并在需要的時候:

    • 'AEC' - matches either attribute or element or class name
    • AEC - 匹配屬性、元素名稱、或類名。

    Let's change our directive to use restrict: 'E':

    讓我們修改我們的指令去使用restrict:'E';

    angular.module('docsRestrictDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.customer = {name: 'Naomi',address: '1600 Amphitheatre'}; }]) .directive('myCustomer', function() {return {restrict: 'E',templateUrl: 'my-customer.html'}; }); <div ng-controller="Controller"><my-customer></my-customer> </div>

    For more on the restrict property, see the API docs.

    查看更多關于約束限制的屬性,可以查看API 文檔;

    When should I use an attribute versus an element? Use an element when you are creating a component that is in control of the template. The common case for this is when you are creating a Domain-Specific Language for parts of your template. Use an attribute when you are decorating an existing element with new functionality. 什么時候我應該使用屬性而不是元素??當你在模板中創建一個控制器的組件的時候,你應該使用元素。通常情況是當你創建一個特定領域的語言給你的模板。當你裝飾一個已經存在的元素賦予更多的功能的時候,你應該使用屬性。

    Using an element for the myCustomer directive is clearly the right choice because you're not decorating an element with some "customer" behavior; you're defining the core behavior of the element as a customer component.

    使用一個元素去對應myCustomer指令是一個顯然正確的選擇,因為你沒有裝飾一個元素一些“customer”的行為;你定義了customer組件的核心行為。

    指令的作用域隔離

    Our myCustomer directive above is great, but it has a fatal flaw. We can only use it once within a given scope.

    我們的myCustomer指令很棒,但是它有一個致命的缺陷,我們只能在指定的作用域中使用它一次。

    In its current implementation, we'd need to create a different controller each time in order to re-use such a directive:

    現在的實現方式,為了重復使用我們的指令,我們必須每次創建不同的控制器。

    angular.module('docsScopeProblemExample', []) .controller('NaomiController', ['$scope', function($scope) {$scope.customer = {name: 'Naomi',address: '1600 Amphitheatre'}; }]) .controller('IgorController', ['$scope', function($scope) {$scope.customer = {name: 'Igor',address: '123 Somewhere'}; }]) .directive('myCustomer', function() {return {restrict: 'E',templateUrl: 'my-customer.html'}; }); <div ng-controller="NaomiController"><my-customer></my-customer> </div> <hr> <div ng-controller="IgorController"><my-customer></my-customer> </div>

    This is clearly not a great solution.

    這顯然不是一個好的解決辦法。

    What we want to be able to do is separate the scope inside a directive from the scope outside, and then map the outer scope to a directive's inner scope. We can do this by creating what we call an isolate scope. To do this, we can use a directive's scope option:

    我們想要有效的分隔作用域內的指令,并且映射外面的作用域到一個指令的內部作用域,我們可以做到,通過創建創建成為隔離作用域。如果這樣使用,我們將創建隔離的作用域。為了這個,我們可以使用作用域的scope選項:

    angular.module('docsIsolateScopeDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };$scope.igor = { name: 'Igor', address: '123 Somewhere' }; }]) .directive('myCustomer', function() {return {restrict: 'E',scope: {customerInfo: '=info'},templateUrl: 'my-customer-iso.html'}; }); <div ng-controller="Controller"><my-customer info="naomi"></my-customer><hr><my-customer info="igor"></my-customer> </div>

    Looking at index.html, the first <my-customer> element binds the info attribute to naomi, which we have exposed on our controller's scope. The second binds info to igor.

    ?讓我們看卡index.html,第一個元素是<my-customer>元素綁定了info屬性到naomi,我們而且將他曝光在了我們的controller作用域。第二個綁定info到igor.

    Let's take a closer look at the scope option:

    我們近一點看看scope選項

    //... scope: { customerInfo: '=info' }, //...

    The scope option is an object that contains a property for each isolate scope binding. In this case it has just one property:

    scope 選項是一個對象,包含 每一個隔離的作用域板頂。這樣它本身就只是一個屬性。

    • Its name (customerInfo) corresponds to the directive's isolate scope property customerInfo.
    • 屬性名(customerInfo)相當于指令的隔離作用域中的屬性customerInfo。
    • Its value (=info) tells $compile to bind to the info attribute.
    • 它的值(=info)告訴$compile去綁定info屬性。
    Note: These =attr attributes in the scope option of directives are normalized just like directive names. To bind to the attribute in <div bind-to-this="thing">, you'd specify a binding of =bindToThis. 注意:?這個 =attr?屬性在? scope?選項 是一個標準化類似于指令的名稱 .去綁定屬性到 <div bind-to-this="thing">,你需要設置值為? =bindToThis.

    For cases where the attribute name is the same as the value you want to bind to inside the directive's scope, you can use this shorthand syntax:

    舉例當你想要綁定到作用域的屬性名與值相同的話,你可以簡寫為以下的語法:

    ... scope: {// same as '=customer'customer: '=' }, ...

    Besides making it possible to bind different data to the scope inside a directive, using an isolated scope has another effect.除此之外,還使它可能去綁定不同的數據到指令的作用域。

    We can show this by adding another property, vojta, to our scope and trying to access it from within our directive's template:

    我們可以添加其他的屬性:vojta,到我們的作用域,并且嘗試在我們的指令中訪問它。

    angular.module('docsIsolationExample', []) .controller('Controller', ['$scope', function($scope) {$scope.naomi = { name: 'Naomi', address: '1600 Amphitheatre' };$scope.vojta = { name: 'Vojta', address: '3456 Somewhere Else' }; }]) .directive('myCustomer', function() {return {restrict: 'E',scope: {customerInfo: '=info'},templateUrl: 'my-customer-plus-vojta.html'}; }); <div ng-controller="Controller"><my-customer info="naomi"></my-customer> </div> Name: {{customerInfo.name}} Address: {{customerInfo.address}} <hr> Name: {{vojta.name}} Address: {{vojta.address}}

    Notice that {{vojta.name}} and {{vojta.address}} are empty, meaning they are undefined. Although we defined vojta in the controller, it's not available within the directive.

    注意{{vojta.name}}和{{vojta.address}}是空的,說明他們是undefined。雖然我們定義了vojta在控制器中,但是它在指令中是無效的。

    As the name suggests, the isolate scope of the directive isolates everything except models that you've explicitly added to thescope: {} hash object. This is helpful when building reusable components because it prevents a component from changing your model state except for the models that you explicitly pass in.

    顧名思義,指令的隔離作用域隔離了除模塊中明確添加到scope對象的任何東西。這在構建可復用組件時很有用,因為它防止組件在修改你的model狀態時只是你明確允許的哪些。

    注意: Normally, a scope prototypically inherits from its parent. An isolated scope does not. See the "Directive Definition Object - scope" section for more information about isolate scopes. 一般情況,一個作用域繼承自它的父類,一個隔離的作用域則不繼承。查看"DIrective Definition Object "了解更多關于隔離作用域的信息。 最佳實踐: Use the scope option to create isolate scopes when making components that you want to reuse throughout your app.當你創建一個你希望能夠在你的應用內復用的組件,使用scope選項去創建一個隔離作用域。

    創建一個指令操作DOM

    In this example we will build a directive that displays the current time. Once a second, it updates the DOM to reflect the current time.

    在例子中,我們將創建一個指令來顯示當前的時間。每一秒,它更新DOM顯示當前時間。

    Directives that want to modify the DOM typically use the link option. link takes a function with the following signature,function link(scope, element, attrs) { ... } where:

    指令要修改DOM,通常使用link選項。link接受一個函數,是這個樣子:function link(scope, element, attrs) { ... }

    • scope is an Angular scope object. 是angular作用域對象
    • element is the jqLite-wrapped element that this directive matches.是一個指令匹配到的那個jqLite包裝后的元素
    • attrs is a hash object with key-value pairs of normalized attribute names and their corresponding attribute values. 是一個鍵值對對象,保存著屬性的名稱和值。

    In our link function, we want to update the displayed time once a second, or whenever a user changes the time formatting string that our directive binds to. We will use the $interval service to call a handler on a regular basis. This is easier than using $timeout but also works better with end-to-end testing, where we want to ensure that all $timeouts have completed before completing the test. We also want to remove the $interval if the directive is deleted so we don't introduce a memory leak.

    在我們的link函數,我們想每一秒更新顯示一次時間,或者我們的指令能夠處理任何時候用戶修改時間的格式。我們將使用$interval服務規律的調用handler方法。這是一個比使用$timeout簡單而且能更好的用于端到端的測試,因為我們要確保在完全測試前完成所有的$timeout調用。我們還希望如果指令刪除的時候能夠刪除$interval避免內存泄漏。

    angular.module('docsTimeDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.format = 'M/d/yy h:mm:ss a'; }]) .directive('myCurrentTime', ['$interval', 'dateFilter', function($interval, dateFilter) {function link(scope, element, attrs) {var format,timeoutId;function updateTime() {element.text(dateFilter(new Date(), format));}scope.$watch(attrs.myCurrentTime, function(value) {format = value;updateTime();});element.on('$destroy', function() {$interval.cancel(timeoutId);});// start the UI update process; save the timeoutId for cancelingtimeoutId = $interval(function() {updateTime(); // update DOM}, 1000);}return {link: link}; }]); <div ng-controller="Controller">Date format: <input ng-model="format"> <hr/>Current time is: <span my-current-time="format"></span> </div>

    There are a couple of things to note here. Just like the module.controller API, the function argument in module.directive is dependency injected. Because of this, we can use $interval and dateFilter inside our directive's link function.

    這里有一兩件事需要注意。正像 module.controller API,module.directive的函數參數是依賴注入的。因為這樣,我們能夠在我們的指令內部link函數中使用$interval和 dateFilter。

    We register an event element.on('$destroy', ...). What fires this $destroy event?

    我們注冊一個事件 element.on('$destroy',...)。如何觸發這個$destroy事件?

    There are a few special events that AngularJS emits. When a DOM node that has been compiled with Angular's compiler is destroyed, it emits a $destroy event. Similarly, when an AngularJS scope is destroyed, it broadcasts a $destroy event to listening scopes.

    這里有幾個AngularJS觸發的特殊事件。當一個DOM節點被angular編譯后,銷毀了,它會觸發$destroy時間。同樣的,當時一個AngularJS作用域銷毀了,它將廣播$destroy事件到監聽的作用域。

    By listening to this event, you can remove event listeners that might cause memory leaks. Listeners registered to scopes and elements are automatically cleaned up when they are destroyed, but if you registered a listener on a service, or registered a listener on a DOM node that isn't being deleted, you'll have to clean it up yourself or you risk introducing a memory leak.

    基于監聽這個事件,你可以刪除事件監聽器可能會引起內存泄漏。監聽器注冊在作用域和元素,當它們銷毀的時候會被自動的清理,但是你要注冊一個監聽器到service或者注冊一個監聽器到DOM節點,并且不要刪除。你將收拾干凈或者引入一個內存泄漏問題。

    最佳實踐: Directives should clean up after themselves. You can use element.on('$destroy', ...) or scope.$on('$destroy', ...) to run a clean-up function when the directive is removed. 指令應該清理他們自身,你可以使用element.on('$destroy',...) 或者scope.$on('$destroy',...)去清理函數當指令刪除的時候。

    創建一個指令包含其他的元素

    We've seen that you can pass in models to a directive using the isolate scope, but sometimes it's desirable to be able to pass in an entire template rather than a string or an object. Let's say that we want to create a "dialog box" component. The dialog box should be able to wrap any arbitrary content.

    我們可以看到你能夠通過一個模型給一個指令使用隔離的作用域,但是有些時候,它理想的是能夠通過整個模板而不是一個字符串或者對象。讓我們去創建一個“對話窗口”組件,這個對話窗口應該能夠包含任何的內容。

    To do this, we need to use the transclude option.

    為此,我們要必須使用transclude選項。

    angular.module('docsTransclusionDirective', []) .controller('Controller', ['$scope', function($scope) {$scope.name = 'Tobias'; }]) .directive('myDialog', function() {return {restrict: 'E',transclude: true,templateUrl: 'my-dialog.html'}; }); <div ng-controller="Controller"><my-dialog>Check out the contents, {{name}}!</my-dialog> </div>

    What does this transclude option do, exactly? transclude makes the contents of a directive with this option have access to the scopeoutside of the directive rather than inside.

    trasclude選項到底做了什么?transclude標記一個指令中的內容基于這個選項可以訪問這個指令以外的作用域。

    To illustrate this, see the example below. Notice that we've added a link function in script.js that redefines name as Jeff. What do you think the {{name}} binding will resolve to now?

    為了演示,我們看下面的例子。注意我們添加了一個link函數到script.js重新定義了name為Jeff。你認為{{name}}現在被綁定到哪個值上了呢?

    angular.module('docsTransclusionExample', []) .controller('Controller', ['$scope', function($scope) {$scope.name = 'Tobias'; }]) .directive('myDialog', function() {return {restrict: 'E',transclude: true,scope: {},templateUrl: 'my-dialog.html',link: function (scope, element) {scope.name = 'Jeff';}}; }); <div ng-controller="Controller"><my-dialog>Check out the contents, {{name}}!</my-dialog> </div>

    Ordinarily, we would expect that {{name}} would be Jeff. However, we see in this example that the {{name}} binding is still Tobias.

    一般情況下我們預計{{name}}應該是Jeff。不過,我們在例子匯總看到的是{{name}}仍然是Tobias。

    The transclude option changes the way scopes are nested. It makes it so that the contents of a transcluded directive have whatever scope is outside the directive, rather than whatever scope is on the inside. In doing so, it gives the contents access to the outside scope.

    這個transclude選項更改作用域嵌套。它標記轉換后的指令里的內容無論如何會使用外部的作用域,而不是內部的作用域。在這樣的情況下,它讓內容訪問的是外部的作用域。

    Note that if the directive did not create its own scope, then scope in scope.name = 'Jeff'; would reference the outside scope and we would see Jeff in the output.

    注意,如果這個指令沒有創建它自己的作用域,然后將在作用域中設置scope.name='Jeff';它將引用外部的作用域,我們將在輸出中看到Jeff。

    This behavior makes sense for a directive that wraps some content, because otherwise you'd have to pass in each model you wanted to use separately. If you have to pass in each model that you want to use, then you can't really have arbitrary contents, can you?

    指令的這種行為是合理的,它包裝一些內容,否則你將不得不在每一個模型中傳遞。如果你不得不在你想要的每個模型中傳遞,那你將不能真正隨心所欲的寫內容,你能嗎?

    最佳實踐: only use transclude: true when you want to create a directive that wraps arbitrary content. 只有當你想創建一個指令想自由的控制內容時,你才使用transclude:true.

    Next, we want to add buttons to this dialog box, and allow someone using the directive to bind their own behavior to it.

    另外,我們希望添加一個按鈕到這個彈出窗口,并且允許使用這個指令去綁定自己的行為。

    angular.module('docsIsoFnBindExample', []) .controller('Controller', ['$scope', '$timeout', function($scope, $timeout) {$scope.name = 'Tobias';$scope.message = '';$scope.hideDialog = function (message) {$scope.message = message;$scope.dialogIsHidden = true;$timeout(function () {$scope.message = '';$scope.dialogIsHidden = false;}, 2000);}; }]) .directive('myDialog', function() {return {restrict: 'E',transclude: true,scope: {'close': '&onClose'},templateUrl: 'my-dialog-close.html'}; }); <div ng-controller="Controller">{{message}}<my-dialog ng-hide="dialogIsHidden" on-close="hideDialog(message)">Check out the contents, {{name}}!</my-dialog> </div>

    We want to run the function we pass by invoking it from the directive's scope, but have it run in the context of the scope where it's registered.

    我們希望運行的函數通過指令的作用域來執行,而且要讓他它在注冊過的上下文中執行。

    We saw earlier how to use =attr in the scope option, but in the above example, we're using &attr instead. The & binding allows a directive to trigger evaluation of an expression in the context of the original scope, at a specific time. Any legal expression is allowed, including an expression which contains a function call. Because of this, & bindings are ideal for binding callback functions to directive behaviors.

    我們看到之前如何使用=attr在scope選項中,但是在上面的例子中,我們使用$attr替代。這種&綁定允許一個指令在特定的時間觸發在原始的作用域中的表達式求值。任何合法的表達式都允許,包括函數調用的表達式。因此,&綁定是一個理想的用來給指令的行為綁定回調函數的方法。

    When the user clicks the x in the dialog, the directive's close function is called, thanks to ng-click. This call to close on the isolated scope actually evaluates the expression hideDialog(message) in the context of the original scope, thus running Controller'shideDialog function.

    接下來我們點擊窗口中的x,這個指令的close函數被調用。感謝ng-click。這次調用close在隔離的作用的域實際上是表達式hideDialog(meesage),我們運行Controller的hideDialog函數。

    Often it's desirable to pass data from the isolate scope via an expression to the parent scope, this can be done by passing a map of local variable names and values into the expression wrapper fn. For example, the hideDialog function takes a message to display when the dialog is hidden. This is specified in the directive by calling close({message: 'closing for now'}). Then the local variable message will be available within the on-close expression.

    通常從隔離的作用域通過表達式獲取父級數據,它可以通過一個本地變量的name和value組成的map放到表達式包裝的函數。拿例子來說,hideDialog函數取得一個message在dialog隱藏的時候顯示。這個指定在指令中叫close({message:'closing for now'}),然后這個本地變量mesage將在on-close表達式中可用。

    最佳實踐: use &attr in the scope option when you want your directive to expose an API for binding to behaviors. 當你想要你的指令暴露一個綁定行為的API的時候,使用&attr在scope選項中。

    創建一個指令添加事件監聽器

    Previously, we used the link function to create a directive that manipulated its DOM elements. Building upon that example, let's make a directive that reacts to events on its elements.

    For instance, what if we wanted to create a directive that lets a user drag an element?

    angular.module('dragModule', []) .directive('myDraggable', ['$document', function($document) {return function(scope, element, attr) {var startX = 0, startY = 0, x = 0, y = 0;element.css({position: 'relative',border: '1px solid red',backgroundColor: 'lightgrey',cursor: 'pointer'});element.on('mousedown', function(event) {// Prevent default dragging of selected contentevent.preventDefault();startX = event.pageX - x;startY = event.pageY - y;$document.on('mousemove', mousemove);$document.on('mouseup', mouseup);});function mousemove(event) {y = event.pageY - startY;x = event.pageX - startX;element.css({top: y + 'px',left: x + 'px'});}function mouseup() {$document.off('mousemove', mousemove);$document.off('mouseup', mouseup);}}; }]); <span my-draggable>Drag ME</span>

    創建指令溝通

    You can compose any directives by using them within templates.

    Sometimes, you want a component that's built from a combination of directives.

    Imagine you want to have a container with tabs in which the contents of the container correspond to which tab is active.

    angular.module('docsTabsExample', []) .directive('myTabs', function() {return {restrict: 'E',transclude: true,scope: {},controller: function($scope) {var panes = $scope.panes = [];$scope.select = function(pane) {angular.forEach(panes, function(pane) {pane.selected = false;});pane.selected = true;};this.addPane = function(pane) {if (panes.length === 0) {$scope.select(pane);}panes.push(pane);};},templateUrl: 'my-tabs.html'}; }) .directive('myPane', function() {return {require: '^myTabs',restrict: 'E',transclude: true,scope: {title: '@'},link: function(scope, element, attrs, tabsCtrl) {tabsCtrl.addPane(scope);},templateUrl: 'my-pane.html'}; }); <my-tabs><my-pane title="Hello"><h4>Hello</h4><p>Lorem ipsum dolor sit amet</p></my-pane><my-pane title="World"><h4>World</h4><em>Mauris elementum elementum enim at suscipit.</em><p><a href ng-click="i = i + 1">counter: {{i || 0}}</a></p></my-pane> </my-tabs> <div class="tabbable"><ul class="nav nav-tabs"><li ng-repeat="pane in panes" ng-class="{active:pane.selected}"><a href="" ng-click="select(pane)">{{pane.title}}</a></li></ul><div class="tab-content" ng-transclude></div> </div> <div class="tab-pane" ng-show="selected" ng-transclude> </div>

    The myPane directive has a require option with value ^myTabs. When a directive uses this option, $compile will throw an error unless the specified controller is found. The ^ prefix means that this directive searches for the controller on its parents (without the ^ prefix, the directive would look for the controller on just its own element).

    So where does this myTabs controller come from? Directives can specify controllers using the unsurprisingly named controller option. As you can see, the myTabs directive uses this option. Just like ngController, this option attaches a controller to the template of the directive.

    If it is necessary to reference the controller or any functions bound to the controller's scope in the template, you can use the optioncontrollerAs to specify the name of the controller as an alias. The directive needs to define a scope for this configuration to be used. This is particularly useful in the case when the directive is used as a component.

    Looking back at myPane's definition, notice the last argument in its link function: tabsCtrl. When a directive requires a controller, it receives that controller as the fourth argument of its link function. Taking advantage of this, myPane can call the addPane function ofmyTabs.

    If multiple controllers are required, the require option of the directive can take an array argument. The corresponding parameter being sent to the link function will also be an array.

    angular.module('docsTabsExample', []) .directive('myPane', function() {return {require: ['^myTabs', '^ngModel'],restrict: 'E',transclude: true,scope: {title: '@'},link: function(scope, element, attrs, controllers) {var tabsCtrl = controllers[0],modelCtrl = controllers[1];tabsCtrl.addPane(scope);},templateUrl: 'my-pane.html'}; });

    Savvy readers may be wondering what the difference is between link and controller. The basic difference is that controller can expose an API, and link functions can interact with controllers using require.

    最佳實踐: use controller when you want to expose an API to other directives. Otherwise use link.

    總結

    Here we've seen the main use cases for directives. Each of these samples acts as a good starting point for creating your own directives.

    You might also be interested in an in-depth explanation of the compilation process that's available in the compiler guide.

    The $compile API page has a comprehensive list of directive options for reference.

    tips:

    本文由wp2Blog導入,原文鏈接:http://devonios.com/4%e3%80%81angular-js-%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0-directives.html

    轉載于:https://my.oschina.net/yangyan/blog/859449

    總結

    以上是生活随笔為你收集整理的4、Angular JS 学习笔记 – 创建自定义指令 [翻译中]的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    色99导航| 久久高清 | 黄色一区三区 | 在线观看国产高清视频 | 99在线视频观看 | 91精品国产亚洲 | 一本一道久久a久久精品 | 亚洲精品 在线视频 | 久久久国产高清 | 亚洲成人免费 | 中文字幕av免费在线观看 | 日韩电影中文字幕在线观看 | 激情网五月天 | 国产精品专区在线 | 天天看天天干天天操 | 亚洲一级片免费观看 | 亚洲综合色婷婷 | 亚洲国产片| 黄色在线成人 | 国产这里只有精品 | 黄a在线| 91免费试看 | 一区二区三区国产欧美 | 精品久久久久久久久中文字幕 | 天天天天干| 五月婷婷丁香激情 | 91视视频在线直接观看在线看网页在线看 | 精品国产乱码久久久久久浪潮 | 正在播放一区 | 国产一区二区久久精品 | jizz18欧美18 | 午夜视频免费在线观看 | 久久免费美女视频 | 日韩中字在线观看 | 亚洲天堂精品视频 | 欧美va电影| 色综合中文字幕 | 中文字幕在线观看第一区 | 456成人精品影院 | 免费观看成人av | 麻豆视频免费在线观看 | 欧美日韩成人一区 | 中文不卡视频 | 伊人五月天.com | 天天综合久久 | 欧美精品久久久久久久久免 | 国产精品igao视频网入口 | 激情五月婷婷综合网 | 一区av在线播放 | 高清视频一区二区三区 | 精品久久久免费视频 | 国产免费区 | 国产三级国产精品国产专区50 | 久久国产美女 | 国产免费人成xvideos视频 | 99久久爱 | 日本精品一区二区 | 精品国产乱码久久久久久浪潮 | 日韩理论| 欧美日韩精品影院 | 国产成人三级在线播放 | 亚洲午夜av | 日本精品免费看 | 欧美日韩一区二区视频在线观看 | 免费观看十分钟 | 久久99精品波多结衣一区 | 超碰在线色 | 天天干,天天草 | 久久网页 | 久久精彩视频 | 夜夜摸夜夜爽 | 日本视频高清 | www日日夜夜 | 国产精品麻豆视频 | 色在线最新 | 综合色天天| 亚洲传媒在线 | 中文字幕在线字幕中文 | 超级碰碰碰免费视频 | 欧美a在线免费观看 | 91色视频| 91亚色视频 | 探花视频在线观看+在线播放 | 狠狠干夜夜操天天爽 | www.香蕉视频在线观看 | 国产在线观看你懂的 | 在线观看亚洲免费视频 | 成人在线观看免费视频 | 久久av中文字幕片 | 国产原创av在线 | 182午夜在线观看 | se婷婷 | 波多野结衣电影一区二区 | 超碰在线日本 | 亚洲精品777 | 亚洲日本va在线观看 | 久草免费在线观看 | 中文字幕九九 | 亚洲精品成人av在线 | 久久综合九色综合欧美狠狠 | free,性欧美| 97视频在线看 | 国产91区| 99热99热 | www日韩精品 | 亚洲视频第一页 | 国产精品久久99综合免费观看尤物 | 久久免费播放 | 日韩二区在线观看 | 蜜臀av在线一区二区三区 | 夜夜操狠狠干 | 久草资源在线观看 | 国产精品 中文字幕 亚洲 欧美 | 日韩欧美国产精品 | 视频三区 | 99麻豆久久久国产精品免费 | 精品国产乱码久久久久 | 成人在线你懂得 | 久久美女高清视频 | 日韩黄在线观看 | 天天色天天射天天综合网 | 免费观看一级特黄欧美大片 | 99re国产| 中文字幕av全部资源www中文字幕在线观看 | 91一区啪爱嗯打偷拍欧美 | 黄污视频网站 | 中文字幕在线观看一区 | 91视频xxxx| 久久久久激情 | 2023年中文无字幕文字 | 国产精品欧美久久久久天天影视 | 一二三四精品 | 超碰在线97观看 | 欧美日本一区 | 国产一区免费视频 | 视频一区在线播放 | 久草在线资源免费 | 日韩一区二区三区在线看 | 天天色天天爱天天射综合 | 久久精品com| 在线岛国av | 99热99| 激情婷婷色 | 国内小视频在线观看 | 欧美粗又大 | 一级淫片a | 天天曰夜夜操 | 91女子私密保健养生少妇 | 国产精品一区二区三区免费看 | 丁香资源影视免费观看 | 国产成人精品午夜在线播放 | 婷婷成人亚洲综合国产xv88 | 高清不卡一区二区在线 | 国内小视频在线观看 | 国产精品区二区三区日本 | 亚洲天堂社区 | 黄色大全免费观看 | 亚洲毛片在线观看. | 1区2区3区在线观看 三级动图 | 日韩在线大片 | 国产高h视频 | 色婷婷国产精品一区在线观看 | 黄色片免费在线 | 亚洲有 在线 | 日日夜夜天天人人 | 国产精品中文久久久久久久 | 黄色电影网站在线观看 | 一级黄色免费 | 国产精品久久久久一区二区三区共 | 国产在线a视频 | 手机看片中文字幕 | 在线99 | 久久精品播放 | 热久久免费国产视频 | 麻豆免费在线视频 | 国产精品电影一区二区 | 免费在线观看av不卡 | 伊人五月婷 | 国产成人精品久久亚洲高清不卡 | 五月天婷婷在线观看视频 | 亚洲乱码久久 | 国产色视频一区 | 日本成址在线观看 | 日韩高清不卡在线 | 久久久久亚洲精品国产 | 国产又黄又爽无遮挡 | 香蕉视频91| 免费看色网站 | 免费久久精品视频 | 国产丝袜一区二区三区 | 午夜123| 中文字幕国产一区 | 国产九九在线 | 天天干天天玩天天操 | 国产成人一区二区三区电影 | 国产精品久久久久9999吃药 | 成年人在线视频观看 | 久久成人毛片 | 免费看黄的视频 | 97视频免费观看2区 亚洲视屏 | 国产亚洲视频系列 | av电影不卡 | 欧美在线观看禁18 | 亚洲视频免费在线观看 | 中文字幕91在线 | 日韩欧美在线观看一区二区三区 | 成人免费在线观看电影 | 一级黄色片网站 | 久草在线在线精品观看 | 91网在线看 | 狠狠狠色丁香婷婷综合久久五月 | 欧美少妇影院 | 国产精品成人国产乱一区 | 一级电影免费在线观看 | 91精品国自产在线偷拍蜜桃 | 婷婷伊人五月天 | 中文视频一区二区 | 久久国产亚洲视频 | 久久五月精品 | 精品96久久久久久中文字幕无 | 国产色婷婷在线 | 久av在线 | 久久国产精品99久久人人澡 | 99riav1国产精品视频 | 最新久久久| 欧美日韩中 | 福利视频 | 日日激情| av网站免费看 | 中文字幕九九 | 521色香蕉网站在线观看 | 日韩视频www| 91看国产 | 免费色视频 | 亚洲一区日韩 | 97超碰人人网 | 中文字幕欧美日韩va免费视频 | 狠狠亚洲 | av在线播放快速免费阴 | 国产精品美女久久久久久久久久久 | 中文字幕 国产 一区 | 婷婷色伊人| 国产日韩精品久久 | 国产精品欧美 | 亚洲国产成人在线 | 久草在线视频中文 | 国产不卡一| 一本一本久久a久久精品综合妖精 | 免费在线观看黄 | 日狠狠 | 成人午夜免费福利 | 狠狠干网 | 国产一区二区三区在线免费观看 | 欧美a影视| 激情av资源 | 免费在线观看成人小视频 | 免费福利在线观看 | 麻豆av一区二区三区在线观看 | 色婷婷久久一区二区 | 亚洲一区视频免费观看 | 天天操天天摸天天爽 | 色婷婷五| 中文字幕亚洲欧美日韩2019 | 日韩特级黄色片 | 中文字幕在线观看的网站 | 涩涩网站在线播放 | 欧美 另类 交 | 欧美激情视频一区二区三区免费 | www久久九| 99久热在线精品视频成人一区 | 伊人影院在线观看 | 嫩嫩影院理论片 | 久久精品久久综合 | 国产精品久久久久久吹潮天美传媒 | 麻豆一区在线观看 | 日韩高清免费在线观看 | 一本一本久久aa综合精品 | 国产精品精品国产 | 亚洲日本色 | 国产中文视频 | 狠狠色丁香久久婷婷综 | 91av视频免费在线观看 | 中文字幕av免费观看 | 亚洲欧美婷婷六月色综合 | 国产精品久久久久久久久久久久久久 | 在线免费观看欧美日韩 | 成人观看 | 1024手机在线看 | 亚洲国产中文字幕在线视频综合 | 免费观看性生交大片3 | 激情五月亚洲 | 69久久夜色精品国产69 | 激情综合网在线观看 | 成人黄色在线观看视频 | 亚洲国产免费看 | 国产精品永久免费 | 亚洲精品影视在线观看 | 在线观看一区 | 日本中文字幕免费观看 | 免费国产在线视频 | 国产精品久久久 | 免费看国产a | 久久精品一区二区国产 | 色婷婷福利视频 | 99在线免费视频 | 免费看三级黄色片 | 国产18精品乱码免费看 | 天堂视频一区 | 黄色三级免费片 | 天天天干天天射天天天操 | 91av在线不卡 | 国产亚洲精品久久久久久久久久 | 亚洲一区日韩在线 | 亚洲第一香蕉视频 | 特级毛片爽www免费版 | 深夜激情影院 | 日韩大片免费在线观看 | 国产色影院 | 国产亚洲视频在线观看 | 婷婷丁香七月 | 香蕉免费在线 | 成人在线视频免费看 | 插插插色综合 | 日韩黄色免费电影 | 精品国产一二三四区 | 久久深夜福利免费观看 | 嫩嫩影院理论片 | 日韩欧美在线观看一区二区三区 | 成人av高清在线观看 | 国产九九九精品视频 | 在线免费观看国产 | 亚洲精品成人 | 97日日碰人人模人人澡分享吧 | 国产国产人免费人成免费视频 | 亚洲最新精品 | 黄色网址国产 | 婷婷亚洲五月色综合 | 精品女同一区二区三区在线观看 | 日韩中文字幕在线观看 | 日本三级不卡 | 久久久精品国产免费观看一区二区 | 国产精品久久久久久久久久不蜜月 | 99精品视频中文字幕 | 国产免费精彩视频 | 大胆欧美gogo免费视频一二区 | 不卡视频在线 | 国产超碰在线观看 | 久久国产福利 | 日日夜夜天天干 | 亚洲精品乱码久久久久v最新版 | 国产男女无遮挡猛进猛出在线观看 | 国产精品入口a级 | 亚洲国产精品传媒在线观看 | 五月婷婷激情网 | 99热精品在线观看 | 天天色天天操综合网 | 亚洲国产精品久久久久久 | 中文字幕免费观看全部电影 | 在线观看的黄色 | 国产精品手机在线播放 | 美女福利视频在线 | 免费日韩电影 | 麻豆视频免费入口 | 亚洲在线视频免费 | 亚洲精品久久久蜜桃直播 | 久久99精品热在线观看 | 国产午夜精品一区二区三区 | 91视频久久久久 | 伊人激情综合 | 午夜12点| 狠狠操在线| 成人黄色小说网 | 日韩欧美精品在线观看 | 国产一级特黄毛片在线毛片 | 精品久久久久久久久久岛国gif | 一区二区三区手机在线观看 | 日韩a在线| 不卡的av在线播放 | 免费a v观看 | 99欧美视频 | 91九色视频在线 | 成人久久久久 | 黄网站污 | 日本久久成人中文字幕电影 | 国产精品岛国久久久久久久久红粉 | 丁香六月天| 激情欧美xxxx | 久久久综合精品 | 97久久精品午夜一区二区 | 久久久久久久久久免费 | 久久久久久久久久久网 | 久久综合久久综合久久 | 欧美国产高清 | 天天爱天天干天天爽 | 国产一在线精品一区在线观看 | 欧洲视频一区 | 又黄又爽又湿又无遮挡的在线视频 | 国产糖心vlog在线观看 | 国产999精品久久久影片官网 | 天堂av在线7| 不卡av电影在线 | 久久99久久99精品免观看粉嫩 | 亚洲综合一区二区精品导航 | 日韩免费不卡视频 | 免费在线播放黄色 | 99久久精品免费看国产免费软件 | 午夜精品一二三区 | 欧美日韩精品免费观看视频 | 日韩精品偷拍 | 99色在线视频 | 激情综合网婷婷 | 99热精品国产一区二区在线观看 | 99久精品| 香蕉网站在线观看 | 久久免费观看视频 | 日韩精品极品视频 | www.狠狠色.com | 亚洲最大av网站 | 免费在线播放 | 国产精品久久久久999 | 国产精品一区二区av | 中文字幕123区| a黄色影院 | 超碰夜夜 | 亚洲免费资源 | 欧美精品一区二区三区四区在线 | 久久久久久久久免费视频 | 五月天综合网站 | 久久久精品国产免费观看一区二区 | 日本动漫做毛片一区二区 | 右手影院亚洲欧美 | 嫩嫩影院理论片 | 中文字幕黄色网址 | av福利网址导航大全 | 国产欧美三级 | 国内精品久久久久久久久久久 | 日韩在线免费播放 | 人人爱人人做人人爽 | 亚洲特级毛片 | 久久精品专区 | 在线观看91网站 | 日韩国产在线观看 | 在线精品在线 | 亚洲国产欧洲综合997久久, | 国产午夜精品一区二区三区嫩草 | 欧美一二区在线 | 国产99久久九九精品免费 | 国产精品永久在线 | 国产一卡在线 | 成人免费在线观看入口 | 久久久三级视频 | 亚洲成人在线免费 | 日韩免费福利 | 久久伊人综合 | 亚洲视频每日更新 | 国内精品久久久精品电影院 | 天堂av在线免费 | 久久久久久免费视频 | 激情五月婷婷 | 波多野结衣视频一区二区 | 一本到在线| 婷婷激情在线 | 蜜臀av性久久久久av蜜臀妖精 | 国内精品久久久久久久久 | 国产免费三级在线观看 | 欧美日韩久久 | 五月婷婷.com | 天天天操天天天干 | 国产精品黄 | 色狠狠久久av五月综合 | 日日操天天爽 | 欧美精品久久天天躁 | 精品网站999www | 日韩一区二区三区免费电影 | 激情久久一区二区三区 | 最近中文字幕在线 | 亚洲国产精品久久久 | 日本中文字幕影院 | 免费三级在线 | 五月天亚洲婷婷 | 欧美天天综合网 | 日韩一区二区三区不卡 | av成人在线播放 | 国产一卡久久电影永久 | 日韩精品中文字幕一区二区 | www.日韩免费 | 深爱激情站 | 久草在线免费播放 | 国产91丝袜在线播放动漫 | 99热手机在线观看 | 国产精品久久久久久久久久久久午 | 日批网站在线观看 | 久久99久久99精品免视看婷婷 | 97超碰免费在线观看 | 久久视频6| 亚洲黄色网络 | 999电影免费在线观看 | 三级毛片视频 | 91.dizhi永久地址最新 | 久久久久久久久久电影 | 人人爽人人爽 | 久草在线最新免费 | 免费在线黄色av | 日韩xxxx视频 | 国产白浆视频 | 国产超碰97| www婷婷| 干狠狠 | 欧美日韩在线精品一区二区 | 丁香花在线视频观看免费 | 91网页版免费观看 | 中文字幕一区二区三区精华液 | 天天操天天色天天射 | 天天天天天天天天操 | 国产亚洲精品日韩在线tv黄 | 91视视频在线直接观看在线看网页在线看 | 国产精品18久久久久vr手机版特色 | 国产黄色大片免费看 | 国产成人久 | 国产精品免费人成网站 | 9在线观看免费高清完整版 玖玖爱免费视频 | 国产一区自拍视频 | 字幕网在线观看 | 亚洲在线免费视频 | 欧美aa在线 | 亚洲视频一区二区三区在线观看 | 日本在线观看中文字幕无线观看 | 97成人在线观看 | 午夜三级理论 | 亚洲精品在线播放视频 | 成人免费看电影 | 久久不卡免费视频 | 激情欧美xxxx | 免费看特级毛片 | 天天爽网站 | 日韩国产精品久久 | 天天干天天拍天天操 | 天操夜夜操| 国产手机在线观看 | av在线观 | 最新成人在线 | 久久中文字幕视频 | 91在线看视频 | 99国产一区二区三精品乱码 | 亚洲在线精品 | 日韩视频免费观看高清 | 人人爽人人爽 | 国产免费视频一区二区裸体 | 国产午夜精品久久久久久久久久 | 少妇18xxxx性xxxx片 | 天天操天天射天天舔 | 婷婷丁香在线视频 | 久久五月情影视 | 国产欧美精品xxxx另类 | 国产黄色av | 亚洲日韩精品欧美一区二区 | 青青草视频精品 | 成人精品久久 | 成人黄色电影在线播放 | 日本xxxxav | ,久久福利影视 | 伊人久久影视 | 一级片视频在线 | 国产麻豆视频在线观看 | 免费久久99精品国产婷婷六月 | 日韩视频1 | 99久久国产免费,99久久国产免费大片 | 中文字幕在线一区观看 | 免费黄色激情视频 | 免费在线观看av网站 | 国产理论在线 | 国产成人久久av977小说 | 天天操夜夜干 | 国产高清专区 | 国产亚洲视频在线观看 | 国产一级片视频 | 国产馆在线播放 | 日p视频| 97视频在线观看播放 | 91在线免费播放视频 | 91av视频| 欧美日韩一区二区三区视频 | 在线 成人 | 日本三级中文字幕在线观看 | 九九热在线精品视频 | 综合久久综合久久 | 日韩免费电影一区二区 | 日韩电影中文字幕在线观看 | 久久国产视屏 | 国产精品免费av | 黄色一区三区 | 久久视频国产精品免费视频在线 | 免费观看黄 | 又黄又爽又色无遮挡免费 | 最近中文字幕mv免费高清在线 | 久久精品亚洲综合专区 | 色婷婷免费视频 | 日韩一区在线免费观看 | 久久精品a | sm免费xx网站| 在线观看第一页 | 日本韩国中文字幕 | 国产成人精品综合久久久 | 国产亚洲精品久久19p | 一区二区丝袜 | 久久久亚洲影院 | 国产成人免费网站 | 亚洲精品综合在线观看 | av成年人电影 | 在线观看亚洲a | av高清不卡 | 国产高清福利在线 | 少妇搡bbbb搡bbb搡aa | 久久a热6| 国产视频亚洲视频 | 精品黄色在线观看 | 人人澡视频 | 久久一区二区免费视频 | 在线观看成人av | 成人av中文字幕 | a天堂免费| 成人国产精品免费观看 | 欧美一级性生活 | 久久国产精品一区二区三区四区 | 91视频在线观看大全 | 天天干天天干天天 | 97av影院| 亚洲电影一区二区 | 久视频在线播放 | 看v片 | 亚洲精品九九 | 天天干天天做 | 亚洲精品永久免费视频 | 一区二区电影网 | 色五丁香 | 精品视频在线免费 | 国产三级精品三级在线观看 | 亚洲激情一区二区三区 | 911国产精品 | 久久久久久久久久影院 | 亚洲精品视频在线看 | 亚洲国产视频直播 | 色欧美日韩 | 欧美日韩中 | 亚洲婷婷伊人 | 人人爽人人澡人人添人人人人 | 99在线观看 | 国内精品久久久久影院一蜜桃 | 日韩在线免费视频观看 | 99精品国产一区二区三区不卡 | 综合久久久久久久久 | 国产精品一区二区久久久久 | 日本动漫做毛片一区二区 | av电影在线免费观看 | 国产激情小视频在线观看 | 色五月成人 | 欧美精彩视频在线观看 | 亚洲视频网站在线观看 | 狂野欧美激情性xxxx | 国产激情电影综合在线看 | 天天综合人人 | 中文字幕在线播放视频 | 日韩成人精品在线观看 | 久久久精品免费观看 | 精品国产诱惑 | 国产一级一片免费播放放 | 欧美精品一二 | 精品国产一区二区三区久久久 | 亚洲国产中文字幕在线视频综合 | 午夜精品久久久久久久久久 | 久久热亚洲 | 最新中文字幕在线播放 | 香蕉视频在线免费 | 天天艹天天操 | 国产精品久久久久久久久久直播 | 欧美日韩99 | 精品免费在线视频 | 欧美精品久久久久久久久久丰满 | 亚洲国内在线 | 国产高清视频免费最新在线 | 91av视屏 | 国产中文字幕免费 | 精品亚洲一区二区三区 | 日本中文一级片 | 九七视频在线观看 | 精品一区二三区 | 超碰97在线资源 | av免费看网站 | 色婷婷在线观看视频 | 国产高清第一页 | 欧美另类人妖 | 99精品99 | 免费看一级一片 | 国产高清av| 在线视频电影 | 国产日产精品一区二区三区四区的观看方式 | 日韩两性视频 | 91成人小视频 | 日韩高清无线码2023 | 日本精品视频免费观看 | 国产 日韩 中文字幕 | 天天干天天操人体 | 国产一级高清 | 一区在线观看 | 欧美少妇的秘密 | 91久草视频 | 91精品国产一区二区在线观看 | 伊人婷婷 | 色婷婷a| 色吊丝在线永久观看最新版本 | 激情久久五月 | 国产精品美女久久久久久久网站 | 国产亚洲高清视频 | 在线观看一区二区视频 | 国产精品黄色影片导航在线观看 | 久草色在线观看 | 精品久久久国产 | av在线日韩 | 久久久精品欧美一区二区免费 | 人人草网站 | 婷婷九九 | 色综合天天射 | www在线观看国产 | 国产高清免费 | 狠狠操影视 | 国产视频久 | 99久久成人| 99国内精品 | 国产精品欧美久久久久天天影视 | 中文字幕在线看视频国产中文版 | 在线综合 亚洲 欧美在线视频 | 午夜精品久久久久久久99热影院 | av免费在线看网站 | 欧美午夜一区二区福利视频 | 欧美视频网址 | 日本中文字幕观看 | www.天天操.com | 天堂麻豆 | 午夜精选视频 | 国产91欧美 | 成人免费在线看片 | 日韩欧美网站 | 黄色电影在线免费观看 | 精品999久久久 | 91中文字幕在线观看 | 国产日韩精品在线观看 | 久久老司机精品视频 | 成人午夜电影免费在线观看 | 色欧美成人精品a∨在线观看 | 国产一区二区三区免费在线观看 | 成全免费观看视频 | 亚洲一区二区三区在线看 | 国产美女精品 | 摸阴视频 | 欧美性极品xxxx娇小 | 欧美九九九 | 色在线国产 | 麻豆精品视频在线 | 亚洲激情在线播放 | 免费观看一级特黄欧美大片 | 久久爱影视i | 欧美激情视频久久 | 婷婷丁香视频 | 天天操天天操天天操天天操天天操天天操 | 波多野结衣精品视频 | 成人在线免费视频观看 | 国产精品久久av | 国产精品免费看久久久8精臀av | 视频成人 | 中文字幕精品久久 | 男女精品久久 | 国产亚洲精品久久久久久无几年桃 | 中文不卡视频在线 | 国产在线视频导航 | 久久综合狠狠综合久久综合88 | 国产午夜剧场 | 中文字幕免费在线 | 国内精品国产三级国产aⅴ久 | 日日干天天 | 丁香六月婷婷激情 | 久久婷婷综合激情 | 国产高清精 | 超碰在线天天 | 日韩av成人在线观看 | 国产资源在线免费观看 | 在线成人免费 | 国内精品久久久久久久影视简单 | 日韩精品一区二区三区中文字幕 | 成av人电影 | 激情网综合 | 久久av网 | 国内久久久 | 久久成人国产精品免费软件 | 亚洲黄色免费电影 | 成人h电影在线观看 | va视频在线观看 | 日韩亚洲在线观看 | 亚洲成av人片在线观看无 | 国产国语在线 | 色综合中文综合网 | 亚洲综合精品视频 | 一二三区av | 欧美另类一二三四区 | 99在线观看免费视频精品观看 | 色综合天天综合 | 国产免费视频一区二区裸体 | www.国产精品| 亚洲最新视频在线 | 亚洲午夜大片 | 久久久久久久免费看 | 亚一亚二国产专区 | 欧美在一区 | 亚洲 欧美 国产 va在线影院 | 91亚洲精品国偷拍 | 亚洲欧美国产精品久久久久 | 就要干b| 美女免费视频网站 | 欧美日韩破处 | 色综合天天天天做夜夜夜夜做 | 欧美日韩国产一区二区三区在线观看 | 黄色性av | 天天操天天色天天射 | 人人干在线观看 | 国产一级片不卡 | 五月天丁香视频 | 超碰99在线| 在线观看色网 | 日本午夜在线观看 | 一区 二区 精品 | 久久99九九99精品 | 丁香 婷婷 激情 | 国产欧美综合在线观看 | 久久精品毛片基地 | 成人久久精品 | 国产一级免费在线观看 | 久草久草在线 | 免费av大全| 国产一区二区在线视频观看 | 在线观看视频一区二区三区 | 日韩高清一区 | 久久久精品国产一区二区电影四季 | 激情综合五月婷婷 | 日韩av黄 | 中文区中文字幕免费看 | 亚洲精品大片www | 91网址在线观看 | 日韩电影中文字幕在线 | 人人玩人人添人人 | 久久天天躁狠狠躁亚洲综合公司 | 天干啦夜天干天干在线线 | 天天天天射 | 国产成人一区二区三区在线观看 | 粉嫩av一区二区三区四区在线观看 | 狠狠干中文字幕 | 一级特黄aaa大片在线观看 | 黄网站色成年免费观看 | 欧美视频在线二区 | 国产精品中文久久久久久久 | 黄网站大全 | 性色在线视频 | 久久精品高清视频 | 国产美女在线观看 | 亚洲国产成人精品电影在线观看 | 日本美女xx| 夜夜操网 | 成人午夜剧场在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 夜夜操天天干 | 日韩电影一区二区三区在线观看 | 欧美伦理电影一区二区 | 亚洲激情中文 | 97超碰人人| 在线观看免费国产小视频 | 九九免费精品视频在线观看 | 亚洲欧洲精品久久 | aa级黄色大片 | 97精品国自产拍在线观看 | 亚洲在线视频网站 | 国产亚洲精品久久久久久网站 | 欧美精品一区二区在线播放 | 久久综合久久综合久久综合 | 国产精品一区二区白浆 | 99福利片| 五月天婷婷免费视频 | 精品久久中文 | 97电影在线看视频 | 亚洲中字幕 | 在线中文字幕av观看 | 亚洲一区天堂 | 波多野结衣在线播放一区 | 中文字幕一区二区三区四区 | www.久久免费视频 | 天天综合成人 | 国产原创在线 | 婷婷网站天天婷婷网站 | 丁香狠狠 | 久草精品在线播放 | 黄色片网站 | 免费观看日韩av | 欧美了一区在线观看 | 久久久久久国产精品美女 | 高清不卡一区二区三区 | 最近最新中文字幕 | 婷婷色网视频在线播放 | av黄色免费看 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 亚洲精品88欧美一区二区 | 91中文字幕在线 | 国产精品久久久久久久久久新婚 | 在线观看国产福利片 | 国产视频 亚洲精品 | 91观看视频 | 亚洲精选国产 | 少妇高潮冒白浆 | 四虎国产精品永久在线国在线 | 国产午夜三级一区二区三桃花影视 | 欧美xxxxx在线视频 | 久久精品久久精品久久 | 婷婷久久网站 | 蜜臀一区二区三区精品免费视频 | 亚洲综合色丁香婷婷六月图片 | 久久天天躁狠狠躁亚洲综合公司 | 婷婷久久精品 | 久久国产精品99久久久久久进口 | 91精品少妇偷拍99 | 久草网视频| 免费中文字幕 | 日韩精品一区二区三区在线播放 | 丝袜网站在线观看 | av在线短片 | 久香蕉 | 国产精品第三页 | 午夜精品久久久久久久99水蜜桃 | 国产成人三级在线播放 | 国产一区精品在线观看 | 在线a视频| 久久国产精品成人免费浪潮 | 亚洲精品高清视频在线观看 | 伊人狠狠干| 日韩mv欧美mv国产精品 | 久草精品视频 | 在线成人性视频 | 国产午夜视频在线观看 | 综合网婷婷 | 日色在线视频 | 精品伊人久久久 | 精品国产视频在线观看 | 99精品国产一区二区三区麻豆 | 国产精品久99 | 久草网站在线 | 免费福利在线观看 | 久久精品视频在线看 | 久久人人精品 | 欧美日韩免费在线观看视频 | 国产麻豆精品95视频 | 国产精品久久一区二区三区, | 热久久免费视频 | 久久免费视频8 | 亚洲麻豆精品 | 免费看的黄网站 | 99精品欧美一区二区三区黑人哦 | 欧美精品久久久久久久久久久 | 成人四虎 | 国产精品久久久久久久久久 | 超碰在线网 | 丁香高清视频在线看看 | 亚洲欧美国产精品18p | 免费黄色在线网址 | 日韩婷婷 | 日韩黄在线观看 | 婷婷五月在线视频 | 色婷婷丁香 | 久久久综合香蕉尹人综合网 | 国内外激情视频 | 欧美一级久久 | 亚洲精品 在线视频 | avav片| 黄色影院在线免费观看 | 国产在线观看免 | av三级在线免费观看 | 国产精品久久久久久久久久免费 | 国产精品一区二区精品视频免费看 | 国产精品6 | 99久国产 | 精品久久久久久久久久岛国gif | 日日夜夜狠狠干 | 久草在线91 | 狠狠狠色狠狠色综合 | 人人看人人爱 | 国产精品欧美久久久久三级 | 狠狠狠狠狠狠狠狠 | 欧美日韩超碰 | 国产精品自拍av | av中文字幕在线观看网站 | 亚洲极色| 国产精品一区二区久久精品 | 日韩理论| 在线观看中文av |