最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

本篇文章為大家展示了如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)公司成立以來不斷整合自身及行業(yè)資源、不斷突破觀念以使企業(yè)策略得到完善和成熟,建立了一套“以技術(shù)為基點,以客戶需求中心、市場為導(dǎo)向”的快速反應(yīng)體系。對公司的主營項目,如中高端企業(yè)網(wǎng)站企劃 / 設(shè)計、行業(yè) / 企業(yè)門戶設(shè)計推廣、行業(yè)門戶平臺運營、成都App制作手機網(wǎng)站制作、微信網(wǎng)站制作、軟件開發(fā)、內(nèi)江機房主機托管等實行標(biāo)準(zhǔn)化操作,讓客戶可以直觀的預(yù)知到從創(chuàng)新互聯(lián)公司可以獲得的服務(wù)效果。

一. html與Controller中的雙向數(shù)據(jù)綁定

html-Controller的雙向數(shù)據(jù)綁定,在開發(fā)中非常常見,也是Angularjs1.x的宣傳點之一,使用中并沒有太多問題。

1.1數(shù)據(jù)從html流向controller

也就是從 視圖層流向 模型層,原生html中需要使用表單元素(例如 input 標(biāo)簽)來收集用戶輸入信息,Angularjs中通過在表單元素上使用 ng-model 標(biāo)簽,當(dāng)用戶輸入信息時,同步將用戶輸入的信息賦值給controller中的變量:


  
    

改變輸出值:

       
   

在頁面上輸入1234567即可看到,每次在頁面輸入數(shù)字后,控制臺輸出的 $scope,testInfo.content 的值都和頁面保持一致:

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

1.2 數(shù)據(jù)從controller流向html

也就是從 模型層流向 數(shù)據(jù)層,當(dāng)controller中的數(shù)據(jù)模型變量發(fā)生變化后,Angularjs又會根據(jù)數(shù)據(jù)模型的值去改變 ng-model 指令綁定的表單元素的值,使用 ng-bind 指令也可以被動獲得來自controller的數(shù)據(jù)流。

我們編寫如下demo進行測試:


  
    +1
    

改變輸出值:

         

使用ng-bind綁定的標(biāo)簽:

    

  
     

demo中,每次點擊 +1按鈕, $scope.testInfo.content 的值會增加1,我們可以看到頁面上的結(jié)果:

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

1.3 你丫倒是刷視圖啊

來看看第一個 活見鬼 的例子,demo跟上面很類似,只是將 鼠標(biāo)點擊觸發(fā)的方式改成了 定時器自動觸發(fā)


  
    +1
    

改變輸出值:

         

使用ng-bind綁定的標(biāo)簽:

    

  
     

你會活見鬼地發(fā)現(xiàn),數(shù)據(jù)模型一直在變,但是頁面卻沒有刷新:

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

這里就是 Angularjs1.X 雙向數(shù)據(jù)綁定中的第一個坑 ,你會發(fā)現(xiàn) $scope上綁定的數(shù)據(jù)模型html中顯示的內(nèi)容有時候并不是實時關(guān)聯(lián)的。這其實和 Angularjs1.X 的執(zhí)行機制有關(guān)系。

如果我們自己來考慮,javascript中有一個變量的值發(fā)生了變化,現(xiàn)在要將這個值同步到html頁面上,需要怎么做呢?我們需要獲取到這個DOM元素,然后改變它的 innerHTML 屬性,如果是表單元素就修改 value 。其實 Angularjs 也是這樣做的,只不過使用了自己的封裝的方法—— $apply()。那么此處的問題其實就在于,在 setInterval 的回調(diào)函數(shù)中去修改數(shù)據(jù)模型的值時,沒有觸發(fā) $apply()方法來更新視圖,而通過調(diào)用 Angularjs 封裝的 ng-* 方法(例如 ng-click 點擊方法)來修改視圖模型時,會自動觸發(fā) $apply()方法,視圖也就同步刷新了。

解決方案1

使用 Angularjs 封裝過的 $interval 服務(wù)來實現(xiàn)定時任務(wù),感興趣的讀者可以自己看一下 Angularjs 源碼中 $intervalProvider 的部分,就會發(fā)現(xiàn)在方法最后的地方調(diào)用了 $rootScope.$apply()

解決方案2

如果依然使用javascript原生的定時方法,那么則需要在修改完視圖的數(shù)據(jù)模型后,手動調(diào)用 $scope.$apply() 方法來將數(shù)據(jù)模型的變動同步到html頁面中。

二. Controller與Directive中的雙向數(shù)據(jù)綁定

除了controller與html中的雙向綁定, Angularjs 中還有另一個 雙向數(shù)據(jù)綁定,那就是controller與directive之間的 綁定。綁定的形式有很多種,我們先來看一下最常見的 雙向綁定。

2.1 directive中的雙向數(shù)據(jù)綁定

在設(shè)定自定義指令的 scope 參數(shù)時,將屬性的值設(shè)置為 = 就可以實現(xiàn)雙向數(shù)據(jù)綁定,這里API的解釋是:

父級controller中的指定變量會與自定義指令link函數(shù)中的變量 相互影響。

下面的實例中,我們將看看controller中的數(shù)據(jù)模型 $scope.testInfo.content 的值與自定義指令中 scope.pagination 如何相互影響,是否如定義所說這里的綁定真的是雙向的。示例界面如下(demo源碼請見附件 demo.html 文件):

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

  • 每次點擊 +1 按鈕, Scope.testInfo.content 的值都會增加1

  • 每次點擊 show $scope.testInfo ,控制臺都會打印出 $scope.testInfo 的值

  • 每次點擊標(biāo)簽上的數(shù)字,則會打印出自定義指令中 scope.pagination 的值,并將該值進行自增

接下來的測試操作,我們將按照如下的流程進行:

  1. 點擊5次+1按鈕,再點擊5次數(shù)字標(biāo)簽

  2. 點擊show $scope.testInfo按鈕

2.2 你丫怎么又不刷新了

隨著上一節(jié)的操作步驟,我們一起來見證 雙向數(shù)據(jù)綁定中又一次鬧鬼事件:

點擊5次 +1 按鈕,再點擊5次數(shù)字標(biāo)簽

結(jié)果為:

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

我們看到,第一次點擊數(shù)字標(biāo)簽時,控制臺打出了link函數(shù)中 scope.pagination 的值為5,這說明 $scope.testInfo.content 的值被傳遞給了自定義指令中的 scope.pagination ,也就是說數(shù)據(jù)從controller流向了directive 。而當(dāng)我們再點擊4次數(shù)字標(biāo)簽(一共點了5次)后,從控制臺可以看出, scope.pagination 的值已經(jīng)成為10,而頁面上使用 ng-bind 指令獲取到的結(jié)果卻依舊是 5。也就是說, 數(shù)據(jù)從沒有從directive流向controller。是不是有一種被騙的感覺?別著急,接著看。

點擊 show $scope.testInfo 按鈕

結(jié)果為:

如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定

當(dāng)我們點擊 show $scope.testInfo 時,控制臺打印出了$scope.testInfo.content的值為5,這下證據(jù)坐實了,明明說好的雙向數(shù)據(jù)綁定,然而當(dāng)自定義指令中的 scope.pagination 改變時, $scope.testInfo.content 并沒有跟著一起改變。 But?。。?!我們會發(fā)現(xiàn),這個 show $scope.testInfo 點下去以后,頁面上通過 ng-bind 綁定的值卻變成了 10。也就是說, 數(shù)據(jù)又從directive流回了controller

官方建議使用 $watch 方法來追蹤scope中的變量,而當(dāng)我們這樣做時,會發(fā)現(xiàn) $watch 函數(shù) 僅能追蹤到那些通過修改controller中的數(shù)據(jù)模型而影響link函數(shù)中變量的行為并更新視圖 。

這里就是 Angularjs1.X 雙向數(shù)據(jù)綁定中的第二個坑,controller和directive中所謂的 雙向數(shù)據(jù)綁定,并不能追蹤指定變量的所有變化,而且不是同步完成的。

其實這里的問題仍然和 Angularjs 的運行機制有關(guān),解決方案如下:

解決方案1

使用自定義指令的 templateUrl 屬性替換當(dāng)前指令的模板,使用 ng-click 指令來綁定一個點擊響應(yīng)函數(shù),在響應(yīng)函數(shù)中改變 scope.piganation 的值。

解決方案2

在手動綁定的監(jiān)聽回調(diào)中,修改自定義指令作用域內(nèi)的變量后,使用 scope.$emit( ) 方法通知其父級controller,并在controller中使用 $scope.$on( ) 方法監(jiān)聽同名事件,并修改對應(yīng)的數(shù)據(jù)模型的值。

解決方案3

每當(dāng)改變自定義指令中的變量值后,調(diào)用 scope.$apply() 方法,將directive中的變量值同步至controller的數(shù)據(jù)模型以及頁面。

三.原理和實戰(zhàn)總結(jié)

3.1 Angularjs中雙向數(shù)據(jù)綁定的基本原理

Angularjs中的雙向數(shù)據(jù)綁定,是通過一種叫做* "臟循環(huán)檢查(dirty-checking)" 的機制實現(xiàn)的。

其基本過程是這樣的,每當(dāng)我們使用 ng-modelng-bind 指令將數(shù)據(jù)模型中的某個變量值和html頁面上某個標(biāo)簽的內(nèi)容聯(lián)系起來時,Angular就會把這些變量放進一個 WatchCollection 的集合中,并自動幫我們來監(jiān)控這些變量。每當(dāng) WatchCollection 中有變量出現(xiàn)變動時,Angular就會遍歷 WatchCollection 來查看是否有其他監(jiān)控中的變量也被影響,每當(dāng)有一個變量被影響,Angular都會在遍歷后再進行一次遍歷,直到某一次遍歷后 WatchCollection 中的變量都沒有變化,則Angular會認(rèn)為當(dāng)前的改動已經(jīng)穩(wěn)定了,然后才會將數(shù)據(jù)模型的變化同步到DOM元素上去,也就實現(xiàn)了數(shù)據(jù)綁定。

我們可以把 WatchCollection 理解為當(dāng)前頁面的一種抽象,其中包含著頁面上所有有可能發(fā)生變化的部分。

3.2 雙向數(shù)據(jù)綁定的實踐經(jīng)驗

想要在 Angularjs 項目中更加穩(wěn)定地使用雙向數(shù)據(jù)綁定,筆者的建議是:

Angularjs 項目中,盡可能地使用Angular告訴你的方式去編寫所希望實現(xiàn)的功能。

我們可以回顧一下上面在使用雙向數(shù)據(jù)綁定發(fā)生異常時的場景:

  • 使用了原生的定時器(Angular中你應(yīng)該使用 $interval , $timeout 服務(wù))

  • 用類原生方法(bind)為元素添加事件監(jiān)聽器,并在回調(diào)函數(shù)中修改了變量的值(Angular中,你應(yīng)該使用 ng-click 來實現(xiàn)點擊事件的監(jiān)聽)

上述內(nèi)容就是如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享題目:如何在Angularjs中實現(xiàn)不同類型的雙向數(shù)據(jù)綁定
瀏覽路徑:http://fisionsoft.com.cn/article/isgeoj.html