Este é o controlador do template principal:
app.controller('OverviewCtrl', ['$scope', '$location', '$routeParams', 'websiteService', 'helperService', function($scope, $location, $routeParams, websiteService, helperService) {
...
$scope.editWebsite = function(id) {
$location.path('/websites/edit/' + id);
};
}]);
Esta é a diretiva:
app.directive('wdaWebsitesOverview', function() {
return {
restrict: 'E',
scope: {
heading: '=',
websites: '=',
editWebsite: '&'
},
templateUrl: 'views/websites-overview.html'
}
});
É assim que a diretiva é aplicada no modelo principal:
<wda-websites-overview heading="'All websites'" websites="websites" edit-website="editWebsite(id)"></wda-websites-overview>
e este método é chamado a partir do modelo de diretiva (website-overview.html):
<td data-ng-click="editWebsite(website.id)">EDIT</td>
PERGUNTA: Quando EDIT é clicado, este erro aparece no console:
TypeError: Não é possível usar o operador 'in' para pesquisar 'editWebsite' em 1
Alguém sabe o que se passa aqui?
fonte
TL; DR; - Você está assumindo que a função associada está sendo passada para o componente filho. Isso está incorreto. Na verdade, o AngularJS está analisando o modelo de string e criando uma nova função, que então chama a função pai.
Esta função precisa receber um objeto com chaves e valores, ao invés de uma variável simples.
Explicação mais longa
Isso acontece quando você vincula uma função usando '&' e tenta chamar essa função de seu controlador, passando uma variável simples em vez de um objeto contendo o nome da variável simples. As chaves de objeto são necessárias para o mecanismo de modelagem descobrir como passar valores para a função vinculada.
por exemplo. você chamou
boundFunction('cats')
ao invés deboundFunction({value: 'cats'})
Exemplo Trabalhado
Digamos que eu crie um componente como este:
Esta função (no pai) tem a seguinte aparência:
No meu modelo pai, agora posso fazer isso:
A ligação aqui será analisada a partir da string. Você não está realmente passando a função. O AngularJS está criando uma função para você que a chama. A ligação criada no modelo pode conter muitas outras coisas além da chamada de função.
O AngularJS, de alguma forma, precisa descobrir de onde sair
value
e faz isso recebendo um objeto do pai.No controlador de meu componente, preciso fazer algo como:
fonte