2013-05-21 4 views
0

각도 지시기 + 컨트롤러를 통해 JQRangeSlider을 처리하고 있습니다.

내 컨트롤러 내에서 범위 값에 새 값을 할당하려고합니다. 올바르게 업데이트 되더라도 컨트롤러 범위에 변경 사항이 통지되지 않습니다. (내 지시문에서 격리 된 범위 '='을 사용하고 있습니다.)

$scope.toggleTimeScale = function(refinementString) { 
    console.log('scale set to', refinementString); 
    $scope.timescale = refinementString; // year, month, day... 
} 

왜 immediatly 변수 변경 통보 $scope.$watch되지 않습니다 :

// JQRangeSlider event handler 
var valuesChanged = function(e, data) { 
    if (data.values.min && data.values.max) { 

     console.log('values changed', data.values); // this is always printed 
     $scope.minselectedtime = data.values.min; // not triggering $scope.$watch 
     $scope.maxselectedtime = data.values.max; 
     $scope.$broadcast('minchanged', $scope.minselectedtime); // instantly triggering $scope.$on('minchanged',...) 
     console.log('scope', $scope); 
    } 
}; 


$scope.$watch('minselectedtime', function(newValue, oldValue) { 
    if (newValue === oldValue) { 
     return; 
    } 
    console.log('minselectedtime -->', newValue); 
}, true); 

$scope.$on('minchanged', function(event, min) { 
    console.log('minchanged ==>', min); 
}); 

$scope.$watch('minselectedtime', ...)

은 ( $scope.minselectedtime이도 수정되지 않습니다) 다음 $scope 수정에 트리거?
격리 된 코드의 $scope.minselectedtime 값이 변경되었지만 $scope.toggleTimeScale이 트리거 될 때까지 변경된 값이 부모 범위에 표시되지 않습니다.

+0

새 값을'$ scope.minselectedtime'과'$ scope.maxselectedtime'에 할당 한 직후에'$ scope. $ apply()'를 사용하여 문제를 해결했지만 이것이 올바른 방법인지는 의심 스럽습니다. . 이 작업을 수행하는 더 좋은 방법이 있습니까? – rxdazn

답변

1

$ scope. $ apply()를 사용하는 방법이 정확합니다. 그 이유는 JQRangeSlider의 업데이트가 angularjs 지식의 '외부'에서 발생했기 때문입니다. $ apply 메소드 (http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply)에있는 문서를 읽으면 필요한 경우에 사용된다는 것을 알 수 있습니다.

관련 문제