angularjs移除不必要的 watch

2021-09-22 00:10:35 字數 3574 閱讀 1627

在我們的

web page

,特別是移動裝置上,太多的

angular $watch

將可能導致效能問題。這篇文章將解釋如何去移除額外的

$watch

提高你的應用程式效能。

$watch

如果不再使用,我們最好將其釋放掉,在

angular

中我們可以自由的選擇在什麼時候將

$watch

從$watch

列表中移除。

讓我們來看個示例:

($scope) ;

var textwatch = $scope.$watch('text', function

(newval, oldval) $scope.updated++;});});

<

body

ng-controller

="mainctrl"

>

<

input

type

="text"

ng-model

="text"

/>

`updated` times updated.

<

button

ng-click

="stop()"

>stop count

button

>

body

>

$watch

函式會返回乙個釋放

$watch

繫結的unbind

函式。所以當我們不再需要

watch

改變的時候,我們可以

easy

的呼叫這個函式釋放

$watch。

讓我假想我們要建立乙個會議

session

預約的頁面,頁面像如下結構:

($scope) });

<

ul>

<

li ng-repeat

="session in sessions"

>

<

div

class

="info"

>

`session`.`name` - `session`.`room` - `session`.`hour` - `session`.`speaker`

div>

<

div

class

="likes"

>

`session`.`likes` likes!

<

button

ng-click

="likesession(session)"

>like it!

button

>

div>

li>

ul>

假想這是乙個大型的預約,一天會有30個

sessions

。這裡會產生多少個

$watch

?這裡每個

session有5

個繫結,額外的

ng-repeat乙個.

這將會產生

151個

$watch

。這有什麼問題?每次使用者「

like」

乙個session

,angular

將會去檢查

name

是不是被改變

(其他的屬性也相同)。

問題在於除了例外的「

like」

外,所有的資料都是靜態資料,這是不是有點浪費資源?我們能夠

100%

保證我們的資料不會改變,既然這樣為什麼我們讓

angular

要去檢查是否改變呢?

解決方案很簡單。我們移除永遠不會改變的

$watch

。$watch

在第一非常重要,它用靜態資訊生產更新了我們的

dom結構,但是在此之後,它監聽了乙個永遠不會被改變的常量,這明顯是很大的浪費資源。

如果你相信我了的話,會我們能怎麼去解決呢?幸運的是,這有個

nice guy

在我們之前也問了自己這個問題,並建立了一系列的指令實現這個:

bindonce

.bindonce

是一系列繫結但是不帶

watch

的指令集,這很完美的符合了我們的需求。

讓我們用

bindonce

重新實現我們的

view:

<

ul>

<

li bindonce ng-repeat

="session in sessions"

>

<

div

class

="info"

>

<

span

bo-text

="session.name"

>

span

>

-<

span

bo-text

="session.room"

>

span

>

-<

span

bo-text

="session.hour"

>

span

>

-<

span

bo-text

="session.speaker"

>

span

>

div>

<

div

class

="likes"

>

`session`.`likes` likes!

<

button

ng-click

="likesession(session)"

>like it!

button

>

div>

li>

ul>

為了讓示例能夠工作,我們必須引入

bindonce

到我們的應用程式。

在這裡我們將

angular

表示式換位了

bo-text

指令。這指令將會繫結我們的

model

,知道更新

dom,然後去掉繫結。這樣我就可以顯示

view

但是移除不必要的餓繫結了。

在此例中每個

session

只有乙個

$watch

繫結,所以這裡用

31個繫結替代了

151個繫結。我們正確的使用

bingonce

將會為我們的應用程式大量減少

$watch

繫結。

當我們的效能無法避免的需要優化的時候,

bindonce

能夠幫助脫離

$watch

的效能瓶頸。在

bindonce

中還有很多的指令,我可以從這裡搜尋到:

wordpress移除不必要的資訊

1.移除不必要的頭部資訊 移除不必要head資訊 remove action wp head wp generator 去除版本資訊 remove action wp head wlwmanifest link remove action wp head rsd link 清除離線編輯器介面 rem...

linux安全 移除不必要的服務

鳥哥的 一 關閉服務 關閉的方法有很多,通常我是使用 usr sbin setup 來關閉的,只是用這樣的方式來關閉的話,需要重新啟動 linux 比較麻煩一些些,如果您是使用我們這個網頁的 redhat6.1 系統的話,那就執行 usr sbin setup 吧!然後選擇 system servi...

避免不必要的float

float中文翻譯為浮動,很形象的翻譯,在css很常用,當你需要吧兩個塊級元素定排放在同一高度上經常會用到float,先看一下float的 屬性。先看一下float可能的值 float left 元素向左浮動 float right 元素向右浮動 float none 不浮動 float inher...