欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡(jiǎn)介可以自動(dòng)完成UI的AngularJS工具angular-smarty

 更新時(shí)間:2015年06月23日 09:00:07   投稿:goldensun  
這篇文章主要介紹了簡(jiǎn)介可以自動(dòng)完成UI的AngularJS工具angular-smarty,包括其中隔離作用域綁定指令符和promise的使用,需要的朋友可以參考下

201562385429453.png (824×898)

我們最近為我們的論壇增加了一個(gè)自動(dòng)完成功能(稱為Smarty),在要求專業(yè)人員簡(jiǎn)介的主頁(yè)上。這是一個(gè)超有用的功能,因?yàn)樗兄谖覀儗⒂脩魧?dǎo)航到他們真正想去的地方。它很有意思,也是用AngularJS構(gòu)建的!

我們希望Smarty能夠:

  1.     通過(guò)用戶的給定輸入 (一個(gè)前綴),通過(guò)一個(gè)HTTP請(qǐng)求后自動(dòng)提供建議
  2.     顯示一個(gè)建議的下拉列表
  3.     當(dāng)用戶輸入時(shí)更新
  4.     足夠快,能夠跟得上用戶的輸入
  5.     導(dǎo)航直觀且能夠關(guān)閉
  6.     可重用

以往沒(méi)有AngularJS的經(jīng)驗(yàn),這個(gè)項(xiàng)目是我使用這個(gè)框架的入門項(xiàng)目。它真的成為了一次寶貴的學(xué)習(xí)經(jīng)驗(yàn),而且我發(fā)現(xiàn)這個(gè)框架許多方面相互借鑒地很好且能很好地符合我上面列出的要求。當(dāng)然,還有一些問(wèn)題尚在學(xué)習(xí)過(guò)程中!

AngularJS的樂(lè)趣所在

我最喜歡Angular的一點(diǎn)是它是如何分解成具有明確目的的概念的。Smarty廣泛使用了其中的兩個(gè)概念——Directives 和 Services。Directive和DOM綁定在了一起,用來(lái)管理和元素之間的交互;而Service通過(guò)依賴注入的方式為Controller和Directive提供了獨(dú)立的可以重用的邏輯。

Angular提供了很多內(nèi)建的Directive和Service,我們?cè)谶@個(gè)項(xiàng)目中使用到了其中的多個(gè)。

    為了顯示建議(見要求2),我們使用了ngIf 和 ngRepeat 指令來(lái)有條件的顯示和填充建議下來(lái)列表。

    為了實(shí)現(xiàn)當(dāng)用戶輸入的時(shí)候更新建議內(nèi)容(見要求3),我們使用了ngModel 指令將$scope上前綴變量上輸入元素的請(qǐng)求和Scope上的$watch方法雙向綁定起來(lái),用來(lái)監(jiān)聽前綴的變化。

    我們需要考慮的一件事是這個(gè)自動(dòng)完成功能的更新速度可能跟不上用戶的輸入速度(見要求4)。因?yàn)槊慨?dāng)前綴的值發(fā)生變化時(shí),Smarty都要發(fā)送一個(gè)HTTP請(qǐng)求(通過(guò)內(nèi)建的$http Service)。我們決定用 $http 的可選配置參數(shù)($http.get(requestUrl, {cache: true}))來(lái)緩存結(jié)果。這是提升性能的一個(gè)很簡(jiǎn)單的方法。

我們還寫了自定義的Directive和Service來(lái)滿足我們的特定需求:

    smartySuggestor Service:smartySuggestor 提供了一個(gè)getSmartySuggestions()函數(shù),用來(lái)接受用戶生成的前綴作為它的參數(shù),并通過(guò)http請(qǐng)求訪問(wèn)我們后端的suggestor服務(wù)來(lái)得到自動(dòng)完成的建議。(見要求1)。

    smartyInput Directive: 我們所面臨的一個(gè)挑戰(zhàn)是,定義出一個(gè)用戶和下拉列表之間的所有可能的交互,并且寫測(cè)試用例,以確保在開發(fā)期間和開發(fā)之后,這些功能都是完好的。我們使用一個(gè)Directive(smartyInput)來(lái)包含用戶和下拉列表之間所有可能發(fā)生的交互(見要求6),同時(shí),我們使用內(nèi)建的ng-mouseover 和 ng-click 指令(Directive)來(lái)定義下拉列表和鼠標(biāo)事件之間的交互。

正如我前邊所提到的,我們所面臨的一個(gè)挑戰(zhàn)是我們要確保我們沒(méi)有破壞掉所有用戶和下拉列表之間可能發(fā)生的交互方式。為了追蹤這些用戶交互,并確保我們沒(méi)有在開發(fā)的過(guò)程中破壞掉它,我們使用了

學(xué)習(xí)總結(jié)

盡管簡(jiǎn)潔實(shí)用的AngularJS框架現(xiàn)在對(duì)我來(lái)講,是可以輕松讀懂的,但是確實(shí)要花些時(shí)間來(lái)學(xué)習(xí)。隔離作用域綁定指令符和promise是我學(xué)習(xí)過(guò)程中特別棘手的兩項(xiàng)專題。當(dāng)我研究隔離作用域時(shí),我發(fā)現(xiàn)自己十分希望能看到更多的關(guān)于人們?nèi)绾卧谒麄兊捻?xiàng)目中使用不同綁定的例子,所以下面我為每種綁定類型給出一個(gè)例子。
=:本地和父作用域之間的雙向數(shù)據(jù)綁定

控制器:
 

$scope.selected = -1;

HTML:
 

<input type="text" smarty-input index="selected">

SmartyInput指令符:
 

scope: {index: "=", ...}

SmartyInput雙向綁定指令符將位于控制器作用域的selected綁定到指令作用域的index索引上面,這樣可以使得在index索引(建議列表中當(dāng)前選定的索引)中的變化結(jié)果與指令(例如用戶按向上/向下箭頭)的相互作用會(huì)傳播到控制器。

&: 本地與父作用域之間的單向數(shù)據(jù)綁定

控制器:
 

$scope.setSelected = function(newValue) {...};

HTML:
 

<input type="text" smarty-input select="setSelected(x)">

SmartyInput指令符:
 

scope: {select: "&", ... }...scope.select({"x": parseInt(scope.index) + 1});

SmartyInput指令符將控制器作用域中的setSelected()函數(shù)綁定到指令作用域中的select()函數(shù)上,這樣可以使指令符在不改變setSelected()函數(shù)的情況下使用它。
@:將計(jì)算表達(dá)式綁定到本地作用域

控制器:
 

$scope.prefix = ""

HTML:
 

<div smarty-suggestions prefix="{{prefix}}">

SmartySuggestions指令符:
 

scope: {prefix: "@", ...}

通過(guò)SmartySuggestions指令符,可在建議菜單中顯示prefix的值,所以此處使用計(jì)算表達(dá)式{{prefix}}。這種綁定方式在多項(xiàng)復(fù)雜表達(dá)式中更常用,比如:next-index=“{{selected + 1}}”。

Promises

promise是用于執(zhí)行異步任務(wù)的技術(shù)。一個(gè)promise具有一個(gè)名為then()的方法,該方法在promise執(zhí)行時(shí)會(huì)作為被執(zhí)行的的回調(diào)函數(shù)的一個(gè)參數(shù)。當(dāng)異步任務(wù)完成,promise會(huì)將一段消息傳給那個(gè)回調(diào)函數(shù)。當(dāng)用戶輸入的prefix前綴中檢測(cè)到更改,則promise就會(huì)出現(xiàn)在Smarty的代碼中,然后我們會(huì)用$http執(zhí)行一個(gè)GET請(qǐng)求,用來(lái)更新顯示給用戶建議的列表。

這個(gè)過(guò)程看起來(lái)是這樣的:

當(dāng)$scope.$watch在$scope.prefix(請(qǐng)注意,此處綁定到用戶UI輸入界面)的值中注冊(cè)了一個(gè)更改,此時(shí)會(huì)調(diào)用getSmartySuggesction()。
 

var promise = smartySuggestor.getSmartySuggestions($scope.prefix);promise.then(function(data) {
  $scope.suggestions = data;});

在getSmartySuggesctions()中,$http.get會(huì)返回一個(gè)參與服務(wù)器響應(yīng)的promise。
 

function getSmartySuggestions(prefix) {
  requestParams["query"] = escape(prefix.toLowerCase());
  var promise = $http.get(requestUrl(),
    {
      params: requestParams,
      cache: true
    }
  ).then(function(response) {
    return response.data.slice(0, 5).map(function(item) {
      return item.Name;
    });
  });
  return promise;}

服務(wù)器響應(yīng)看起來(lái)是這樣的:

[{"ID":13,"Name":"Portrait Photography"},{"ID":24,"Name":"Commercial Photography"},{"ID":21,"Name":"Pet Photography"},{"ID":16,"Name":"Event Photography"},{"ID":26,"Name":"Headshot Photography"}]


接下來(lái),我們會(huì)調(diào)用存在于promise中的then()方法,在解析服務(wù)器響應(yīng)回調(diào)中進(jìn)行傳遞。then()方法返回一個(gè)新的promise,它處理了解析過(guò)的響應(yīng),并存儲(chǔ)到通過(guò)getSmartySuggestions()返回的promise中。

解析過(guò)的響應(yīng)看起來(lái)是這樣的:[“Portrait Photography”, “Commercial Photography”, “Pet Photography”, “Event Photography”, “Headshot Photography”]。

最終,回到$scope.$watch,我們調(diào)用promise中的then()方法,為變量suggestions分配這些解析過(guò)的響應(yīng)。
 

var promise = smartySuggestor.getSmartySuggestions($scope.prefix);
promise.then(function(data) {
  $scope.suggestions = data;
});

 

相關(guān)文章

  • AngularJS自定義控件實(shí)例詳解

    AngularJS自定義控件實(shí)例詳解

    這篇文章主要介紹了AngularJS自定義控件,結(jié)合實(shí)例形式詳細(xì)分析了AngularJS自定義指令與模板操作的相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下
    2016-12-12
  • Angular5.1新功能分享

    Angular5.1新功能分享

    這篇文章主要介紹了Angular5.1新功能以及相關(guān)的用法,需要的朋友參考學(xué)習(xí)下吧。
    2017-12-12
  • 三種AngularJS中獲取數(shù)據(jù)源的方式

    三種AngularJS中獲取數(shù)據(jù)源的方式

    這篇文章主要介紹了三種AngularJS中獲取數(shù)據(jù)源的方式,需要的朋友可以參考下
    2016-02-02
  • AngularJS HTML編譯器介紹

    AngularJS HTML編譯器介紹

    這篇文章主要介紹了AngularJS HTML編譯器介紹,AngularJS的HTML編譯器能讓瀏覽器識(shí)別新的HTML語(yǔ)法。它能讓你將行為關(guān)聯(lián)到HTML元素或者屬性上,甚至能讓你創(chuàng)造具有自定義行為的新元素,需要的朋友可以參考下
    2014-12-12
  • AngularJS 工作原理詳解

    AngularJS 工作原理詳解

    本文主要介紹AngularJS 工作原理,這里整理了相關(guān)資料及示例代碼,有興趣的小伙伴可以參考下
    2016-08-08
  • AngularJS基礎(chǔ) ng-show 指令簡(jiǎn)單示例

    AngularJS基礎(chǔ) ng-show 指令簡(jiǎn)單示例

    本文主要介紹AngularJS ng-show 指令,這里對(duì)ng-show 指令的基礎(chǔ)知識(shí)做了詳細(xì)介紹,并附有代碼示例,希望能幫助學(xué)習(xí)AngularJS的同學(xué)
    2016-08-08
  • AngularJS 過(guò)濾與排序詳解及實(shí)例代碼

    AngularJS 過(guò)濾與排序詳解及實(shí)例代碼

    這篇文章主要介紹了AngularJS 過(guò)濾與排序,這里整理了詳細(xì)的資料及簡(jiǎn)單實(shí)例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • angularJS中router的使用指南

    angularJS中router的使用指南

    這篇文章主要介紹了angularJS中router的使用方法和示例分享,需要的朋友可以參考下
    2015-02-02
  • 詳解Angular5 服務(wù)端渲染實(shí)戰(zhàn)

    詳解Angular5 服務(wù)端渲染實(shí)戰(zhàn)

    本篇文章主要介紹了詳解Angular5 服務(wù)端渲染實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 深入理解Angular2 模板語(yǔ)法

    深入理解Angular2 模板語(yǔ)法

    這篇文章主要介紹了Angular2 模板語(yǔ)法的相關(guān)資料,非常不錯(cuò),感興趣的朋友一起學(xué)習(xí)吧,需要的朋友可以參考下
    2016-08-08

最新評(píng)論