2013-07-12 47 views
64

在視頻AngularJS MTV Meetup: Best Practices (2012/12/11),MISKO解釋說,「..如果您使用NG-模型必須有某處的一個點。如果你沒有一個點,你就錯了。」爲什麼AngularJS文檔不在模型指令中使用點?

然而, Angular.JS website中的第一個例子(The Basics)似乎與它相矛盾。是什麼賦予了?自MTV大會以來,Angular.JS是否發生了變化,現在它更加寬容於ng-model?

+0

我個人認爲這更像是關於建模系統的哲學問題。有些人使用'$ scope'作爲視圖模型,其他人則不使用。這是一個偏好問題。 – yuxhuang

+0

請參閱http:// stackoverflow。com/questions/15623698/directive-isolate-scope-with-ng-repeat-scope/15645354#15645354 – yanhan

回答

101

與範圍繼承的複雜問題時的小點是非常重要的。

egghead.io video "The Dot"有一個很好的概述,做到這一點非常流行的堆棧溢出問題:What are the nuances of scope prototypal/prototypical inheritance in AngularJS?

我將在這裏總結一下:

Angular.js使用範圍繼承允許子作用域(如子控制器)查看父範圍的屬性。所以,讓我們說你有像設置:

<div ng-controller="ParentCtrl"> 
    <input type="text" ng-model="foo"/> 
    <div ng-controller="ChildCtrl"> 
     <input type="text" ng-model="foo"/> 
    </div> 
</div> 

Play along on a JSFiddle

首先,如果你開始的應用程序,並輸入到父輸入時,孩子會更新,以反映它。

但是,如果編輯子範圍,父的連接,現在壞了,兩個不再同步跟進。另一方面,如果您使用ng-model="baz.bar",則鏈接將保留。

出現這種情況的原因是因爲孩子Scope使用原型繼承來查找值,所以只要它永遠不會對孩子設置,那麼它會推遲到父範圍。但是,一旦設置,它不再查找父母。

當你使用一個對象(baz)代替,從來都沒有被設置在兒童範圍,產業依然存在。

對於更深入的細節,檢查出StackOverflow answer

+3

該egghead視頻是值得它的黃金重量。最好的描述這個問題,永遠。 –

+0

什麼是簡潔的總結 - 太棒了。 – drjimmie1976

+1

我是唯一一個認爲添加任意容器變量令人難以置信的人嗎?我明白爲什麼這是一個「最佳實踐」,但看到包含實際重要內容的隨機變量是非常難看的。我實際上傾向於避免這個「最佳實踐」。我不經常遇到任何問題,因爲我留意後果。在一年的密集角度發展過程中,我一直沒有被這種困擾。 – Spencer

17

當你prototypically繼承的情況下,從另一個範圍,例如點會被要求NG-重複了這prototypically從母體繼承的範圍每行項目創建一個新的範圍。在基本的例子中,沒有原型繼承,因爲只有一個範圍,但是如果你有一些子範圍,那麼你將開始面對這個問題。下面的鏈接將使一切變得清晰。

https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-repeat

0

因此,要解決這個問題,確保在JS聲明父第一:

例如

$scope.parent 

依次爲:

$scope.parent.child = "Imma child"; 

正是這樣做的孩子沒有家長會打破角。

相關問題