Уязвимость привязана к элементу привязки AngularJS - TypeError: не может использовать оператор "in" для поиска "functionName" в 1

Это контроллер основного шаблона:

app.controller('OverviewCtrl', ['$scope', '$location', '$routeParams', 'websiteService', 'helperService', function($scope, $location, $routeParams, websiteService, helperService) {
    ...     
    $scope.editWebsite = function(id) {
        $location.path('/websites/edit/' + id);
    };
}]);

Это директива:

app.directive('wdaWebsitesOverview', function() {
    return {
        restrict: 'E',
        scope: {
            heading: '=',
            websites: '=',
            editWebsite: '&'
        },
        templateUrl: 'views/websites-overview.html'
    }
});

Так директива применяется в основном шаблоне:

<wda-websites-overview heading="'All websites'" websites="websites" edit-website="editWebsite(id)"></wda-websites-overview>

и этот метод вызывается из шаблона директивы (website-overview.html):

<td data-ng-click="editWebsite(website.id)">EDIT</td>

ВОПРОС: Когда щелкнут EDIT, эта ошибка появляется в консоли:

TypeError: не может использовать оператор 'in' для поиска 'editWebsite' в 1

Кто-нибудь знает, что здесь происходит?

Ответ 1

Поскольку вы определили привязку выражения (&), вам нужно явно вызвать его с помощью JSON, содержащего id, если вы хотите связать его в HTML как edit-website="editWebsite(id)".

Действительно, Angular должен понимать, что этот id в вашем HTML, и поскольку он не является частью вашей области действия, вам нужно добавить то, что называется "locals" для вашего вызова, выполнив:

data-ng-click="editWebsite({id: website.id})"

Или как альтернатива:

data-ng-click="onClick(website.id)"

С кодом контроллера/ссылки:

$scope.onClick = function(id) {
  // Ad "id" to the locals of "editWebsite" 
  $scope.editWebsite({id: id});
}

Это описано здесь, ищите пример, включающий "close({message: 'closing for now'})"

https://docs.angularjs.org/guide/directive