2012-10-17 4 views
0

Контроллеры:Как получить доступ к текущему элементу коллекции в дочернем контроллере?

var ProductsCtrl = function ($scope) { 
    $scope.products = [ {name: 'one'}, {name: 'two'}, {name:'three'} ]; 
}; 

var ProductCtrl = function ($scope) { 
    $scope. // How do I access the current product name? 
}; 

вид:

<ul ng-controller='ProductsCtrl'> 
    <li ng-repeat='product in products' ng-controller='ProductCtrl'> 
    </li> 
</ul> 

ответ

2

В настоящее время продукт доступен в объеме, как "продукт" в вашем случае.

если вы повторить что-то вроде этого:

нг-повтора = «пункт в пунктах» ваш контроллер ребенок будет иметь «элемент» в области.

Таким образом, в вашем примере:

<ul ng-controller='ProductsCtrl'> 
    <li ng-repeat='product in products' ng-controller='ProductCtrl'> 
    {{product.name}} 
    </li> 
</ul> 
+0

Да - но что, если вы делаете общую директиву функцию, предназначенную для компонуемы? В этом случае было бы плохо вводить ограничения на именование переменных области действия в директиве. ng-repeat должен разрешать доступ к директивам «sibling» для имен текущего элемента и текущего списка (возможно, похоже на $ first/$ last). Судя по источнику, было бы очень легко добавить это в ngRepeatDirective .. – LOAS

+0

Директивы Sibling имеют доступ к «продукту» и «продуктам», если одна из директив sibling не определяет область выделения. – ganaraj

+0

Ты меня неправильно понял. У директив братьев и сестер есть доступ, да. Но что, если директивы сиблинга написаны кем-то другим, кто не знает имена имен переменных «элемент в коллекции» в атрибуте ng-repeat в разметке? Эта информация (имя переменной) существует в директиве repeat-директивы, но не отображается в директивах sibling. В настоящее время директивы сиблинга должны анализировать эту информацию из атрибута ngRepeat - что немного надоедает. Не стесняйтесь исправить меня, если есть лучший способ :) – LOAS

1

@ganaraj уже предоставил правильный ответ. Но я хотел бы указать, что в вашем примере вам, вероятно, не нужно объявлять контроллер в элементе < li>. Дочерние области, созданные ng-repeat для каждого продукта, имеют доступ к контроллеру ProductCtrl. Вы должны только

<li ng-repeat='product in products'> 

Смотрите также раздел «Контроллер Наследование Пример» на Understanding the Controller Component странице.

Вы можете добавить методы в область $ ProdctsCtrl, которые принимают аргумент продукта, который затем можно было бы вызвать внутри ng-repeat. Например, в контроллере:

var ProductsCtrl = function ($scope) { 
    ... 
    $scope.totalPrice = function(product) { 
     return product.price * product.quantity; 
    } 
} 

В вашем HTML:

<li ng-repeat='product in products'> 
    total cost = {{totalPrice(product)}} 
</li> 
+0

Yup, но мой контроллер реагировал на внешнее событие с помощью излучателя события. events.on ('event', function() {$ scope.product.sell()}); – Pickels

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