문제

내 지시문에 전달하는 동안 사용될 객체 내부에 함수를 할당해야 하는 사용자 지정 지시문을 만들고 있습니다.그러나 템플릿 내부에 함수 이름을 직접 작성하여 메서드를 전달하면 제대로 작동합니다.하지만 해당 메서드 참조를 개체 속성 중 하나에 할당한 다음 템플릿에서 이를 사용하여 지시문에 전달하면 작동하지 않습니다.

여기에서 볼 수 있습니다 - jsfiddle

콘솔에서 볼 수 있습니다.저장 버튼을 클릭하면 지시문 내에서 저장 기능이 호출되지만 거기에서는 작동하지 않는 컨트롤러 메서드를 호출하고 있습니다.하지만 함수 이름을 쓰면 blabla 대신에 dynamicMethods.myMethod 그런 다음 전화를 걸지만 내부 경고가 정의되지 않았습니다.

감사합니다.

도움이 되었습니까?

해결책

당신은 거의 옳았습니다.

첫 번째 실수는 정의했을 때였습니다. dynamicMethods 당신이 참조하고 있는 객체 $scope.blabla 아직 존재하지 않았던 것입니다.

두 번째 실수는 값을 accept 상위 범위에 바인딩된 함수 호출을 다음과 같이 전달해야 합니다.

$scope.accept({msg: "from dir"})

어디 msg 표현식 값에 사용할 수 있는 이름이 지정된 지역 변수입니다. accept 사용자 정의 지시문 호출의 속성 <editkeyvalue accept="dynamicMethods.myMethod(msg)" ...

업데이트했습니다 너의 바이올린 따라서.

당신이 쓸 때 accept: "&" 당신은 각도에게 말하고 있습니다

  1. 사용 $parse 표현식을 구문 분석하는 서비스(dynamicMethods.myMethod(msg))
  2. "바인드"(를 통해 자바스크립트 클로저) $scope 1단계에서 반환된 함수를 원래 범위(귀하의 경우 컨트롤러 범위)로
  3. 함수를 내부에 저장 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"]);

무슨 일이 일어나고 있는지 이해하는 데 조금 도움이 되길 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top