2014-02-25 2 views
6

Chrome 앱에서 직렬 통신을위한 작은 JS 라이브러리를 작성했으며 자체적으로 올바르게 작동합니다. 그러나 Angular와 통합 할 때 문제가 있습니다. 컨트롤러 외부의 직렬 객체 속성을 내부에서 볼 수있는 방법이 없기 때문에 해결 방법을 찾을 수 없었습니다. 이상적으로는 너무 비싸지 않은 솔루션이 있습니다. 전체 라이브러리를 각도 지향적 인 형식으로 변환하는 방법을 배제하지 않습니다. 그러나이 상황에서 나는 그것이 서비스 또는 다른 형식으로되어야하는지 확신 할 수 없다. 어떤 도움을 주시면 감사하겠습니다.AngularJS에서 외부 변수보기?

답변

6

그냥 여기에서 아이디어를 빌려 :.이 작업을 수행 할 수 있도록 In AngularJS, how do I add a $watch on the URL hash?

$ 범위 $ 시계는, 첫 번째 인수로 기능을 허용합니다

$scope.$watch(function() { 
    return mylib.myproperty 
}, function (value) { 
    // do stuff 
}); 

UPDATE : 코멘트에 언급 한 바와 같이 , mylib.myproperty가 변경되면 컨트롤러는 다음 다이제스트 cicle까지 알 수 없습니다. 그냥 시계를 삭제할 수 있도록, 당신이 이미 mylib.on_myproperty_change이 지금부터

mylib.on_myproperty_change(function(){ 
    $scope.$digest(); // this will cause the $watch to be re-evaluated 
}); 

하지만 당신이 정말로 $watch 아무것도 필요하지 않습니다 MYLIB은 각 지원하지 않기 때문에 당신은 콜백 메커니즘은 자바 스크립트 일반을 사용할 필요가

myAngularApp.service('MyCustomLib', function(){ 
    return myCustomLibInstance; 
    }] 
); 

그런 다음 당신이 컨트롤러에 그것을 통과하고 난을 저장할 수 있습니다

mylib.on_myproperty_change(function(){ 
    //do the stuff that you did in the the $watch 
    $scope.$digest(); 
}); 
+0

+1; 이것은 컨트롤러에 "전역 종속성"을 추가하지는 않지만 단위 테스트 관점에서 보편적으로 나쁜 것으로 간주됩니다. – JeffryHouser

+2

콜백은 무언가 다이제스트주기가 발생할 때만 호출됩니다. 사용자/앱이 상호 작용하지 않는 경우 – Sylvain

+0

@ Silvain이 말했듯이, 이것에 대한 나의 우려는 사용자 상호 작용없이 동적 업데이트를 원한다는 것입니다. 내가 할 수있는 방법이 있습니까? 이거? – Andy

1

는 각도 서비스로 사용자 정의 라이브러리 만들기 로컬 범위에 t :

function MyCtrl($scope,MyCustomLib) { 
    var myCustomLib = MyCustomLib; 

그리고 지금 @tony는 그의 대답에 제안했던대로, 당신은 컨트롤러 내부에서 사용자 정의 라이브러리에 액세스 할 수 있으며 당신이 시계를 설정할 수 있습니다

$scope.$watch(
function() { 
    return myCustomLib.property 
}, 
function (newValue, oldValue) { 
// do stuff 
}); 
0

다이제스트주기를 시작하는 방법은 $timeout(function() {})입니다.

$scope.$digest() 이미 실행중인 다이제스트주기가있는 경우 오류가 발생합니다.

나는 확실하게 나를 위해 실행되지 않은

// From my controller 
externalService.setOnChangeCallback(function() { $timeout(function() {}) }); 

// in my service 
// on change event 
this.onChangeCallBack(); 

$scope.$watch로 있습니다. 때로는 시청 가치가 재평가되었지만 때로는 그렇지 않은 경우도있었습니다.