2014-11-19 5 views
1

는 JS를 호출하는 다트 코드익명 콜백 함수가

class LandingController { 
    bool hideDiv = false; 

    void doit() { 
     new JsObject(context['loginControls']).callMethod('fadeLogin', [() { 
     print(hideDiv); 
     hideDiv = true; 
     print(hideDiv); 
     print("WTF"); 
     }]); 
    } 
} 

에게 주어 사용자 작업 때까지 다트 컨트롤러를 업데이트하지 않습니다 : 뷰에 영향을해야

var loginControls = function() { 
    this.fadeLogin = function(func) { 
    $('#landingHeader').animate({ opacity: 0 }, 500, func); 
    } 
}; 

:

<button ng-click="doit();">Click</button> 
<div id="landingHeader">Hide me after button click</div> 
<div ng-if="ctrl.hideDiv == false"><img src="assets/img/ajax-loader-small.gif">Waiting for div to disappear...</div> 

버튼 클릭 후 500 밀리미터 내 콘솔에 "WTF"프린트가 올바르게 표시됩니다. 그러나 div은 여전히 ​​볼 수 있습니다. 내 행동이 일단 마우스 클릭으로 발생하면 div이 마술처럼 사라집니다. 컨트롤러의 값이 변경된 것처럼 보이지만 익명 콜백에 컨트롤러의 값을 인쇄 했으므로 브라우저가 div를 숨기기 위해 변경 사항을받지 못합니다.

해결 방법이 있지만 다트 타이머 설정은 JsObject 호출 후에 자바 스크립트에서 사용하는 것과 동일한 페이드 시간으로 설정하고 해당 타이머 콜백에서 컨트롤러 값을 설정하는 것이지만 작동합니다.

답변

1

scope.apply()으로 전화해야한다고 생각합니다. 나는 Angular가 doit()이 JS와 같은 다른 영역에서 호출 될 때 hideDiv의 값 변경을 인식 할 수 없다고 생각합니다.

일반적으로 scope.apply()을 Angular.dart로 호출 할 필요는 없지만 이것은 예외 중 하나라고 생각합니다.

animate의 기능이 jQuery을 사용하는 유일한 이유는 무엇입니까? Angular.darts 애니메이션 기능을 사용하면 더 쉽게 수행 할 수 있습니다.

+0

이것은 효과가 있습니다. 'scope.apply()'를 잊어 버리는 것은 어리석은 짓입니다.하지만 저는 끊임없이해야합니다. 희망이 사람을 도움이됩니다. 제쳐두고, 현재 애니메이션 용으로 만 사용하고 있지만 이것은 모의 사이트이며 앞으로 확장 될 수 있습니다. 나는 이것에 대한 연구를하고 [pub 패키지 (애니메이션을위한 패키지)] (https://pub.dartlang.org/packages/animation)를 찾았지만, 누락 된 기능 섹션은 저를 멀리했습니다. – Squiggler

+1

Angular.darts의 애니메이션 지원에 대해 알고 계신가요? https://www.youtube.com/watch?v=EqilB8nJ6gE –

+0

글쎄. 내가해야 할 리팩터링이있는 것처럼 보입니다! 감사!! – Squiggler

관련 문제