編輯:我覺得我的意見與我以前的迴應,因爲它基本上是「你錯了,按我的方式」,所以這裏是對問題的解釋。
你有一個設置ng-ctrl
的div。這個div現在有一個範圍,其實例爲myCtrl
。
ng-include
創建一個子範圍,它從其父範圍(以前創建的myCtrl
範圍)繼承。此作用域不會直接引用selectedCountry或countries,,但角度會在未找到值時自動搜索父級作用域。 這是重要的。 (這是JavaScript原型繼承的工作原理。更多信息here。)
您還有一個ng-view
,在您的路由提供程序中,您告訴它已將其控制器設置爲myCtrl。這意味着它將創建一個單獨的myCtrl
範圍,這也是外部範圍的子範圍。由於它是myCtrl
範圍外的孩子,就像你的ng-include
作用域一樣,angular通常會搜索其父級在其直接作用域上找不到的屬性。
然而,這是它變得複雜。在這種情況下,因爲它也是myCtrl
的另一個實例,所以它自己創建了selectedCountry
和countries
的新屬性,因此在引用它們時不需要搜索其父項的屬性。角匹配參考對象,而不是由一個深對象比較,因此這些對象都被認爲是不同並從列表中選擇一個事改變selectedCountry
到不上列表B.存在的對象的參考
這就是爲什麼你不得不使用$parent
來嘗試指向與其外部範圍相同的引用,而你的ng-include
通過它的父級自動引用它。
與您的代碼的第二個問題,就是同時你的selectedCountry
值使用$parent
,你沒有不使用$parent
爲countries
陣列,因此它使用的的孩子,被重新創建的對象的數組myCtrl
填寫您的選擇框。同樣,即使對象具有相同的值,角色也會通過參考ng-options
進行比較。因此選擇A上的Modor
與選擇B上的Modor
不同。
作爲附加說明,如果您沒有爲selectedCountry
上的menu.html和checkout.html設置$parent
,還可以創建第三個問題。雖然最初它會搜索父項selectedCountry
,但如果您更改了選擇項,它將在子範圍上創建一個屬性,而不是冒泡到父項,因此從此不再匹配父項的selectedCountry
版本。
因此,爲了總結,你已經編碼它的方式,你有兩個選擇。
的胡扯選擇:
$parent.everything
- 這裏是一個
$parent
固定Plunkr一切(請不要這樣做)
負責任的選擇:
- 使用
controllerAs
永遠阻止範圍問題
- 下面是我如何與
controllerAs
做一個Plunkr爲controllerAs
簡要指南是here
TL; DR;如果你不想讀指南
- 在你的HTML - >
ng-controller="myCtrl as myCtrl"
- 另外在你的HTML - >
myCtrl.countries
- 如果這是一個路由/指令,設置該屬性 - >
controllerAs: 'myCtrl'
- 在你的控制器,而不是
$scope.stuff
- >this.stuff
- 注:
this
用於屬性/功能分配。如果您使用$scope
功能,如$watch
,則仍在$scope
上完成。
只是作爲一個額外的小費,這是我bible對角編碼。遵循這些準則,您的代碼將完美無瑕,並防止您遇到這些類型的缺陷。
非常感謝您的回答,以及您採取的延伸措施。我只是一步混淆。看來代碼的最後一部分沒有將正確的信息傳遞給我使用的指令。這些信息應該像'ngCart.setshipping(30);'那樣傳遞,但是使用'this.changeShipping = function()ngCart.setShipping(this.selectedCountry.shipping); };'它似乎沒有工作。我做了另一個plunkr,所以你可以看到指令不更新(http://plnkr.co/edit/iY4Hssm0PTfjGyGRWAwP?p=preview)謝謝! – Joe82
我看到的唯一問題是,你沒有添加'myCtrl'到運輸功能,就像這樣:'ng-change =「myCtrl.changeShipping()」'然後它似乎適用於我,發送30,70,100等等...... –
就是這樣!我將你的答案標記爲正確(現在開始仔細閱讀你提供的所有信息)。感謝所有的解釋! – Joe82