[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에 신호를 보내서 변경하기에 충분하기 때문입니다.

$applyAngularJ가 현재 $digest단계에 있는 동안 함수 를 사용하려고 할 때 수많은 오류가 발생합니다 . safeApply위 의 코드는 이러한 오류를 방지하기위한 안전한 래퍼입니다.

(참고 : 개인적 으로 편의상 safeApply기능에 익숙해 지기를 좋아 $rootScope합니다)

예:

function change() {
    alert("a");
    var scope = angular.element($("#outer")).scope();
    scope.safeApply(function(){
        scope.msg = 'Superhero';
    })
}

데모 : http://jsfiddle.net/sXkjc/227/


답변

이를 수행하는 다른 방법은 다음과 같습니다.

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';
    })
}