AngularJS 지시문 요소 메서드 바인딩-TypeError : 'in'연산자를 사용하여 1에서 'functionName'을 검색 할 수 없습니다.
다음은 기본 템플릿의 컨트롤러입니다.
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>
질문 : 편집을 클릭하면 다음 오류가 콘솔에 나타납니다.
TypeError : 'in'연산자를 사용하여 1에서 'editWebsite'를 검색 할 수 없습니다.
여기서 무슨 일이 일어나는지 아는 사람 있나요?
표현식 바인딩 ( &
) 을 정의 했으므로 id
HTML에서 .js로 바인딩하려는 경우를 포함하는 JSON을 사용하여 명시 적으로 호출해야합니다 edit-website="editWebsite(id)"
.
실제로 Angular id
는 이것이 여러분의 HTML에있는 것이 무엇인지 이해할 필요가 있습니다. 그리고 그것이 여러분의 범위의 일부가 아니기 때문에 다음을 수행하여 호출에 "로컬"이라고하는 것을 추가해야합니다.
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
TL; DR; -바인딩 된 함수가 자식 구성 요소에 전달되고 있다고 가정합니다. 이것은 올바르지 않습니다. 실제로 AngularJS는 문자열 템플릿을 구문 분석하고 새 함수를 생성 한 다음 부모 함수를 호출합니다.
이 함수는 일반 변수가 아닌 키와 값이있는 객체를 받아야합니다.
더 긴 설명
이것은 '&'를 사용하여 함수를 바인딩하고 컨트롤러에서 해당 함수를 호출하여 일반 변수의 이름을 포함하는 개체가 아닌 일반 변수를 전달하려고 시도했을 때 발생합니다. 객체 키는 바운드 함수에 값을 전달하는 방법을 알아 내기 위해 템플릿 엔진에 필요합니다.
예. 당신은 불렀다 boundFunction('cats')
보다는boundFunction({value: 'cats'})
작동 예
다음과 같은 구성 요소를 만듭니다.
const MyComponent = {
bindings: {
onSearch: '&'
},
controller: controller
};
이 함수 (부모)는 다음과 같습니다.
onSearch(value) {
// do search
}
이제 부모 템플릿에서 다음을 수행 할 수 있습니다.
<my-component on-search="onSearch(value)"></my-component>
여기의 바인딩은 문자열에서 구문 분석됩니다. 실제로 함수를 전달하는 것이 아닙니다. AngularJS는 함수를 호출하는 함수를 만들고 있습니다. 템플릿에서 생성 된 바인딩은 함수 호출 외에 많은 것을 포함 할 수 있습니다.
AngularJS somehow needs to work out where to get value
from, and it does this by receiving an object from the parent.
In myComponent controller, I need to do something like:
handleOnSearch(value) {
if (this.onSearch) {
this.onSearch({value: value})
}
}
'developer tip' 카테고리의 다른 글
Kotlin 배열을 Java varargs로 변환 (0) | 2020.09.16 |
---|---|
bootRun에서 JVM 옵션을 전달하는 방법 (0) | 2020.09.16 |
문자열 배열 초기화 옵션 (0) | 2020.09.16 |
boolean (물음표 없음)을 반환하는 Java 메서드에 대한 명명 규칙 (0) | 2020.09.16 |
HTML5 : 두 개의 입력이 가능한 슬라이더? (0) | 2020.09.16 |