2016-02-13 154 views
14

AngularJS提供雙向數據綁定。爲什麼AngularJS中的雙向數據綁定是反模式?

我建幾個AngularJS應用,發現雙向綁定是一個強大的功能,是提高我的工作效率。

然而最近我來了越來越多的跨聲稱雙向綁定是一個反帖子和文章。

例子:

大多數資源的主張,主張 「單向數據流」 就像它是由反應,和/提拔通量。

而且Angular2 announced一段時間不會有雙向綁定...但最新文件顯示,它實際上是提供two-way databinding via ngModel再次(在上實現性財產和事件結合)

但是我還沒有完全理解AngularJS中與雙向數據綁定相關的問題。

其他客戶端技術(即擺動,Eclipse的RCP,的WinForms,WPF ...)還提供雙向數據綁定,我從來沒有絆倒的要求,這是一個反模式...

有沒有一個規範的例子可以很容易地說明AngularJS中雙向數據綁定可能導致的問題?

The video我聯繫上面似乎暗示$scope.watch是問題...但例如可以在不$scope.watch通過結合暴露在$scope的功能來實現。
如果您避免使用$scope(即使用controller as),雙向數據綁定仍存在哪些問題?

+2

雙向綁定的事情是,它每次觸發時都會觸發級聯事件。這可能會對正在追蹤的最簡單的操作造成非常大的開銷。 雖然它不是一件壞事,但它在任何設計中本質上都是一個弱點。除非你確切地知道你在做什麼,否則編寫緩慢的代碼很容易。 AngularJS從設計決定開始就一直在努力,這也是Angular 2以不同方式建立的原因。像React和KnockOut這樣的框架在設計上是單向的。 – MartijnK

+0

@MartijnK感謝您的評論。你的觀點基本上解釋了在AngularJS中雙向數據綁定實施不力......這真的是雙向數據綁定的「概念」是反模式的原因嗎? Knockout還提供了雙向數據綁定......所以在使用Knockout作爲框架時它不是反模式? – jbandi

+1

我認爲任何調用雙向綁定反模式的人都會爭辯說,它會以犧牲應用程序性能,可維護性和可伸縮性爲代價,爲工程師節省一些時間和精力。對於Angular 1.x,每個摘要循環都會觸發一系列髒檢查和回調,如果您不知道如何以及爲何要添加手錶,可能會很快失去控制。說這是一個反模式是一個嚴厲的批評恕我直言,但我可以看到爲什麼有些人不喜歡它。 –

回答

5

實際上,雙向數據綁定的主要問題是性能。當開發者AngularJS發佈時(1),這個特性成爲開發人員廣泛使用該框架的首要原因。

如果沒有一行代碼,您可以通過從模型側或視圖側更改其值來使元素完全動態化,該值在設置模型的任何位置都會更改。

在這個特性中,最重要的工具是監視,它代表了雙向數據綁定的所有問題。

隨着應用程序的發展,觀察者和觀察元素的數量也在增加。
此外,一段時間後,應用程序可以成爲觀察者的大湯。
這會導致您的應用程序始終監視元素並在反面保持最新的元素,並且會從瀏覽器中消耗大量資源。

這就是爲什麼我的建議是:儘量避免看守者。
它們在控制器中幾乎從未真正需要。

參見:

希望這對您更加清晰。

+0

雙向數據綁定本身並不是性能的原因,所以第一個聲明是真實的和錯誤的,這取決於其他因素,所以這是錯誤的。作爲@MartijnK的 –

+1

在他的評論中指出,觸發事件的級聯基本上是問題。 Angular.js假定事件是非純的(即可能會改變狀態/模型),所以Angular始終假定在每個事件之後所有數據都可能被更改。 –