[angularjs] 외부 js 함수의 AngularJS 액세스 범위
외부 자바 스크립트 함수를 통해 컨트롤러의 내부 범위에 액세스하는 간단한 방법이 있는지 확인하려고합니다 (대상 컨트롤러와 완전히 관련이 없음)
나는 여기에 몇 가지 다른 질문을 보았습니다.
angular.element("#scope").scope();
DOM 요소에서 범위를 검색하지만 현재 시도한 결과가 적절하지 않습니다.
jsfiddle은 다음과 같습니다. http://jsfiddle.net/sXkjc/5/
나는 현재 일반 JS에서 Angular 로의 전환을 겪고 있습니다. 이것을 달성하려는 주된 이유는 원래 라이브러리 코드를 가능한 한 손상시키지 않는 것입니다. 각 기능을 컨트롤러에 추가 할 필요가 없습니다.
이것을 달성하는 방법에 대한 아이디어가 있습니까? 위의 바이올린에 대한 의견도 환영합니다.
답변
jquery / javascript 이벤트 핸들러와 같이 angularjs의 제어 외부에서 범위 값을 변경 하려면 $ scope. $ apply () 를 사용해야합니다.
function change() {
alert("a");
var scope = angular.element($("#outer")).scope();
scope.$apply(function(){
scope.msg = 'Superhero';
})
}
데모 : 바이올린
답변
이 질문을 게시한지 오래되었지만이 견해를 고려할 때 지난 몇 개월 동안 내가 얻은 또 다른 해결책이 있습니다.
$scope.safeApply = function( fn ) {
var phase = this.$root.$$phase;
if(phase == '$apply' || phase == '$digest') {
if(fn) {
fn();
}
} else {
this.$apply(fn);
}
};
위의 코드는 기본적라는 함수 만들고 safeApply
호출되어 것을 $apply
(아룬의 대답에 명시된 바와 같이) 함수 만 각도 현재의 경우와는 겪고되지$digest
단계. 반면에 Angular 가 현재 소화하고 있다면 , 기능을 그대로 실행합니다. Angular에 신호를 보내서 변경하기에 충분하기 때문입니다.
$apply
AngularJ가 현재 $digest
단계에 있는 동안 함수 를 사용하려고 할 때 수많은 오류가 발생합니다 . safeApply
위 의 코드는 이러한 오류를 방지하기위한 안전한 래퍼입니다.
(참고 : 개인적 으로 편의상 safeApply
기능에 익숙해 지기를 좋아 $rootScope
합니다)
예:
function change() {
alert("a");
var scope = angular.element($("#outer")).scope();
scope.safeApply(function(){
scope.msg = 'Superhero';
})
}
답변
이를 수행하는 다른 방법은 다음과 같습니다.
var extScope;
var app = angular.module('myApp', []);
app.controller('myController',function($scope, $http){
extScope = $scope;
})
//below you do what you want to do with $scope as extScope
extScope.$apply(function(){
extScope.test = 'Hello world';
})
답변
로드 후 호출 할 수 있습니다
http://jsfiddle.net/gentletech/s3qtv/3/
<div id="wrap" ng-controller="Ctrl">
{{message}}<br>
{{info}}
</div>
<a onClick="hi()">click me </a>
function Ctrl($scope) {
$scope.message = "hi robi";
$scope.updateMessage = function(_s){
$scope.message = _s;
};
}
function hi(){
var scope = angular.element(document.getElementById("wrap")).scope();
scope.$apply(function() {
scope.info = "nami";
scope.updateMessage("i am new fans like nami");
});
}
답변
이 질문을 한 지 오랜 시간이 지났지 만 jquery가 필요없는 답변이 있습니다.
function change() {
var scope = angular.element(document.querySelector('#outside')).scope();
scope.$apply(function(){
scope.msg = 'Superhero';
})
}
답변
재사용 가능한 솔루션은 다음과 같습니다. http://jsfiddle.net/flobar/r28b0gmq/
function accessScope(node, func) {
var scope = angular.element(document.querySelector(node)).scope();
scope.$apply(func);
}
window.onload = function () {
accessScope('#outer', function (scope) {
// change any property inside the scope
scope.name = 'John';
scope.sname = 'Doe';
scope.msg = 'Superhero';
});
};
답변
시도해 볼 수도 있습니다 :
function change() {
var scope = angular.element( document.getElementById('outer') ).scope();
scope.$apply(function(){
scope.msg = 'Superhero';
})
}