2013-12-19 170 views
3

我正在檢查Angular Bootstrap UI,尤其是服務$modal,並注意到一件有趣的事情。爲什麼需要額外的對象?

在他們在這裏控制器「http://plnkr.co/edit/E5xYKPQwYtsLJUa6FxWt?p=preview」樣本而被附接到彈出窗口它們包圍所選擇的項目到另一個內屬性

$scope.selected = { 
    item: $scope.items[0] 
}; 

代替具有隻是

$scope.selected = $scope.items[0]; 

和的他們的代碼確實按預期工作,而我的版本沒有。

這是爲什麼需要?這裏有什麼JavaScript問題?

THX

+1

我將採取一個措施,並猜測它與您的示例中的'scope.selected'引用'$ scope.items [0]'有關,併成爲它自己的對象,其中包含一個值他們的例子。雖然我不是100%,但我希望你能得到比這更好的答案。 – Shaded

+0

由於原型繼承。請參閱[AngularJS中範圍原型/原型繼承的細微差別?](http://stackoverflow.com/questions/14049480/what-are-the-nuances-of-scope-prototypal-prototypical-inheritance-in-angularjs )。 – Stewie

+0

檢查[這篇文章](https://github.com/angular/angular.js/wiki/Understanding-Scopes)。 – raina77ow

回答

0

他們嵌套的屬性,因爲他們希望這樣做的模式:

<li ng-repeat="item in items"> 
    <a ng-click="selected.item = item">{{ item }}</a> 
</li> 

ng-repeat會爲每個<li>(模態子範圍創建子範圍,以及);如果您有$scope.selected = $scope.items[0];,則ng-click中的設置selected將在子作用域中設置屬性,但不在父作用域中(這是您在此示例中所需的)。另請參閱我的回答here。在

$scope.selected = { 
    item: $scope.items[0] 
}; 

該變化將影響父範圍的selected對象。

+0

那麼基本上,如果我把它正確的,任何時候你通過代碼創建一個控制器,或者你有一個模式對話框是更好地將該控制器的所有屬性包含到一個新的對象,像這樣 $ scope.scope = {放置所有新的屬性}這樣我們就避免了碰撞和原型繼承。 – Eugen

+0

它取決於 - 如果你想與你的範圍共享一個對象在你的範圍內,那麼你需要將它嵌入到某個東西中;那麼你可以在父範圍的繼承對象上設置屬性;如果不嵌套它並分配一個新值,它將簡單地覆蓋子範圍中的現有對象,而不是修改父對象。如果您不需要通過繼承與子範圍共享數據,則不需要人爲地嵌套它 –

0

此之前,所以我決定到周圍挖:)

看來問題是與原語和範圍繼承了竊聽我。在對象中存儲屬性可確保它們不會像ngRepeat這樣的指令中被覆蓋。

此處瞭解詳情:https://github.com/angular/angular.js/wiki/Understanding-Scopes

另外值得注意的是,雖然做NG點擊=「將selectedItem =項目」是行不通的,NG-點擊=「選擇信息(項目)」將無需容器對象。

相關問題