각도의 사용자 정의 지시문에 동적 메서드 전달
-
21-12-2019 - |
문제
내 지시문에 전달하는 동안 사용될 객체 내부에 함수를 할당해야 하는 사용자 지정 지시문을 만들고 있습니다.그러나 템플릿 내부에 함수 이름을 직접 작성하여 메서드를 전달하면 제대로 작동합니다.하지만 해당 메서드 참조를 개체 속성 중 하나에 할당한 다음 템플릿에서 이를 사용하여 지시문에 전달하면 작동하지 않습니다.
여기에서 볼 수 있습니다 - jsfiddle
콘솔에서 볼 수 있습니다.저장 버튼을 클릭하면 지시문 내에서 저장 기능이 호출되지만 거기에서는 작동하지 않는 컨트롤러 메서드를 호출하고 있습니다.하지만 함수 이름을 쓰면 blabla
대신에 dynamicMethods.myMethod
그런 다음 전화를 걸지만 내부 경고가 정의되지 않았습니다.
감사합니다.
해결책
당신은 거의 옳았습니다.
첫 번째 실수는 정의했을 때였습니다. dynamicMethods
당신이 참조하고 있는 객체 $scope.blabla
아직 존재하지 않았던 것입니다.
두 번째 실수는 값을 accept
상위 범위에 바인딩된 함수 호출을 다음과 같이 전달해야 합니다.
$scope.accept({msg: "from dir"})
어디 msg
표현식 값에 사용할 수 있는 이름이 지정된 지역 변수입니다. accept
사용자 정의 지시문 호출의 속성 <editkeyvalue accept="dynamicMethods.myMethod(msg)" ...
업데이트했습니다 너의 바이올린 따라서.
당신이 쓸 때 accept: "&"
당신은 각도에게 말하고 있습니다
- 사용
$parse
표현식을 구문 분석하는 서비스(dynamicMethods.myMethod(msg)
) - "바인드"(를 통해 자바스크립트 클로저)
$scope
1단계에서 반환된 함수를 원래 범위(귀하의 경우 컨트롤러 범위)로 - 함수를 내부에 저장
accept
지시어 로컬 범위의 속성입니다.
이제 내용을 검사하면 $scope.accept
지시어로 호출하기 직전에 다음과 비슷한 내용이 표시됩니다.
function (locals) {
return parentGet(parentScope, locals);
}
어디 locals
반환된 함수의 평가에 도달할 때 사용되는 지역 변수가 있는 객체입니다. $parse
.자바스크립트에는 명명된 매개변수가 없기 때문에 우리는 지역 변수의 값을 어떻게든 가리키고 싶지 않습니다. msg
"from dir"은 키가 변수 이름을 나타내는 간단한 객체로 전달됩니다. {msg: "from dir"}
.
Angular는 표현식(문자열)을 보고 다음을 평가하고 찾습니다. msg
괄호 안에 있으므로 매개변수처럼 보입니다. 이 값은 다음에서 찾을 수 있습니다. locals
물체.
실제 함수를 호출할 때가 되면 각도가 변환됩니다. locals
객체를 일반 배열로 - 표현식에서 읽은 매개변수의 순서를 유지하고 다음과 유사한 방식으로 함수를 호출합니다.
var locals = {msg: "from dir"};
var targetFn = dynamicMethods.myMethod;
var context = dynamicMethods;
targetFn.apply(context, ["from dir"]);
무슨 일이 일어나고 있는지 이해하는 데 조금 도움이 되길 바랍니다.