2013-12-19 3 views
3

Я проверяю пользовательский интерфейс Angular Bootstrap, особенно сервис $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];, установка selected из ng-click будет устанавливать свойство в области дочерних объектов, но не в родительскую область (именно это вы хотите в этом примере). Также см. Мой ответ here. В случае

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

изменение будет влиять на selected объект родительского прицела.

+0

Хорошо, если я правильно понял, когда вы создаете контроллер по коду или у вас есть модальный диалог, лучше вложить все свойства этого контроллера в новый объект, что-то вроде этого $ scope.scope = {здесь мы поместите все новые свойства} таким образом, мы избегаем любых конфликтов и наследования прототипов. – Eugen

+0

Это зависит от того, хотите ли вы разделить объект в своей области с дочерними областями, тогда вам нужно что-то в нем вложить; то вы можете установить свойства унаследованного объекта из родительской области; если вы не вложили его и не присвоили новое значение, он просто перезапишет существующий объект в области вашего дочернего элемента вместо изменения родительского объекта. Если вам не нужно делиться данными с дочерними областями через наследование, вам не нужно искусственно вставлять их –

0

Это прослушивают меня раньше, так что я решил покопаться :)

Кажется, вопрос с примитивами и наследования областей видимости. Сохранение свойств в объектах гарантирует, что они не будут перезаписаны в таких директивах, как ngRepeat.

Больше информации здесь: https://github.com/angular/angular.js/wiki/Understanding-Scopes

Также стоит отметить, что при этом нг-клик = «SelectedItem = пункт» не будет работать, нг-клик = «SelectItem (пункт)» будет, не имея объект контейнера ,

Смежные вопросы