변수를 저장하기 위해 Angular에서 $ rootScope를 어떻게 사용합니까?


217

$rootScope나중에 다른 컨트롤러에서 액세스하려는 컨트롤러에 변수를 저장 하는 데 어떻게 사용 합니까? 예를 들면 다음과 같습니다.

angular.module('myApp').controller('myCtrl', function($scope) {
  var a = //something in the scope
  //put it in the root scope
});

angular.module('myApp').controller('myCtrl2', function($scope) {
  var b = //get var a from root scope somehow
  //use var b
});

어떻게해야합니까?


1
컨트롤러에 $ rootScope를 삽입하고이를 간단한 자바 스크립트로 사용해야합니다
Ajay Beniwal

30
$ rootScope는 올바른 방법이 아닙니다. 여러 컨트롤러에서 변수를 사용할 수있게 만드는 것은 거의 서비스의 대상입니다.
Steve

11
@ 스티브는 : 각도의 질문은 이것은 $ 소화주기에 너무 많은 부하가 걸릴 것입니다 .. "그의 유일한 목적은 인생에서 데이터의 저장 및 복귀 비트있는 서비스를 만들 수 없습니다"라는
Marwen 트라벨시

컨트롤러를 서비스에 주입 할 수없는 경우, 해당 서비스에서 다른 컨트롤러로 변수를 보내려면 어떻게해야합니까? 내가 ...이 작업을 얻을 수있는 방법을 볼 수 없습니다 여기에 귀하의 통찰력을 주셔서 감사합니다 ..
착륙

2
글쎄, 주사 할 수 없기 때문에, 당신은 그것을 위해 주사기가 필요합니다 ..
Xsmael

답변:


248

루트 범위에서 설정된 변수는 프로토 타입 상속을 통해 컨트롤러 범위에서 사용할 수 있습니다.

다음은 @Nitish 데모의 수정 버전으로 관계를 좀 더 명확하게 보여줍니다. http://jsfiddle.net/TmPk5/6/

rootScope의 변수는 모듈이 초기화 될 때 설정되며, 상속 된 각 범위는 독립적으로 설정할 수있는 고유 한 복사본을 가져옵니다 ( change함수). 또한 rootScope의 값도 업데이트 할 수 있습니다 (의 changeRs기능 myCtrl2)

angular.module('myApp', [])
.run(function($rootScope) {
    $rootScope.test = new Date();
})
.controller('myCtrl', function($scope, $rootScope) {
  $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
})
.controller('myCtrl2', function($scope, $rootScope) {
    $scope.change = function() {
        $scope.test = new Date();
    };

    $scope.changeRs = function() {
        $rootScope.test = new Date();
    };

    $scope.getOrig = function() {
        return $rootScope.test;
    };
});

7
플러스 1은 ... 어 ... 실제로 OP의 질문에 대답합니다. (@MBielski 및 기타가 옳음).

내가 $scope.test = 'Some value'하면 $rootScope.test변경 사항도 적용됩니까?
Allen Linatoc

@AllenLinatoc 아니요, 범위 $rootScope 가 전역 적이지만 (모든 컨트롤러에서) $scope컨트롤러에 대해 로컬로 유지 되지만 두 가지 다른 객체가 아닙니다 . $scope.test두 개의 다른 컨트롤러에서 사용하는 경우 $rootScope.test 모든 컨트롤러에서 동일한 변수가 될지 여부에 따라 두 개의 다른 변수임을 알 수 있습니다.
Xsmael

다른 언어에서 전역 변수를 사용하지 않는 것과 같은 이유로 $ rootScope를 자주 사용하고 싶지 않다고 가정합니다.
Zypps987

앱에서 만들 수있는 루트 스코프 변수는 몇 개입니까?
Jay

161

컨트롤러 간 데이터 공유는 팩토리 / 서비스가 매우 유용합니다. 요컨대, 그것은 이런 식으로 작동합니다.

var app = angular.module('myApp', []);

app.factory('items', function() {
    var items = [];
    var itemsService = {};

    itemsService.add = function(item) {
        items.push(item);
    };
    itemsService.list = function() {
        return items;
    };

    return itemsService;
});

function Ctrl1($scope,items) {
    $scope.list = items.list; 
}

function Ctrl2($scope, items) {
    $scope.add = items.add;
}

이 바이올린에서 실제 예제를 볼 수 있습니다 : http://jsfiddle.net/mbielski/m8saa/


49
+1 $rootScope서비스 및 팩토리와 같은 것들이있을 때 변수를 공유하는 데 사용해서는 안됩니다.
jjperezaguinaga

74
글쎄, Angular FAQ는 페이지 맨 아래에 이것을 말합니다. "반대로, 인생의 유일한 목적은 데이터의 비트를 저장하고 반환하는 서비스를 만들지 마십시오." 참조 : docs.angularjs.org/misc/faq
Oytun

11
이것은 간단한 예입니다. 나는 그들이 하나의 컨트롤러에만 나타나는 서비스를 갖지 말라고 말하고 있다고 믿습니다. Angular를 개발 한 직원이 서비스가 컨트롤러간에 데이터를 전달하는 공식적인 방법이라고 구체적으로 말한 곳은 몇 개입니까? 메일 링리스트를 살펴보고 다양한 각도 조명을 요청하고 얻을 수있는 것을 확인하십시오. 또한 귀하의 견적은 "$ rootScope가 존재하지만 악의적으로 사용될 수 있습니다."섹션의 맨 아래에 있습니다. 한 컨트롤러에서 다른 컨트롤러로 데이터를 전달하는 것은 좋지 않습니다.
MBielski

1
그러나 두 개의 다른보기 / 컨트롤러에서 항목을 반복 해야하는 경우 컨트롤러에서 데이터를 먼저 복사하여보기에 제공해야합니까? (나는 이것이 $ rootScope가 해결되었다고 믿는다)
Thomas

1
서비스의 사용 여부 또는 rootScope 빠른 수정에 대한 판단을 내리는 것은 개발자의 몫입니다. 전역 범위는 시설이자 편리한 것입니다. Angular 문서가 말하려는 것은 그렇게 생각합니다. 예술을 프로그래밍으로 유지하고 완전히 MVC의 blah blah의 로봇이되지 않도록하십시오. 하나의 컨트롤러가 변경 사항에 대해 알아야 할 경우 위의 서비스를 사용하고 변수를 $ watch 할 수 있지만 실제로는 컨트롤러 간의 통신이 아닙니다.
착륙

21
angular.module('myApp').controller('myCtrl', function($scope, $rootScope) {
   var a = //something in the scope
   //put it in the root scope
    $rootScope.test = "TEST";
 });

angular.module('myApp').controller('myCtrl2', function($scope, $rootScope) {
   var b = //get var a from root scope somehow
   //use var b

   $scope.value = $rootScope.test;
   alert($scope.value);

 //    var b = $rootScope.test;
 //  alert(b);
 });

데모


따라서 Angular에서는 일반적으로 var를 사용하지 않습니까?
trysis

1
상태에 따라 다릅니다. html로 표시하려면 u를 사용해야합니다. 그렇지 않으면 u를 사용할 수 있습니다. var
Nitish Kumar

오 범위는 DOM에 관한 것입니까?
trysis

1
이것은 늦을 수도 있지만 모든 후발 업체의 경우 AJS 설명서에 따라 뷰와 컨트롤러 사이의 범위가 달라집니다. scope는 DOM을 직접 참조하지 않습니다. 그럼 그게 뭐야? 더 자세한 문서는 다음과 같습니다. docs.angularjs.org/guide/scope
yantaq

9

이 작업을 수행 할 이유가 없습니다. $ scope.value = $ rootScope.test;

$ scope는 이미 $ rootScope의 프로토 타입 상속입니다.

이 예를 참조하십시오

var app = angular.module('app',[]).run(function($rootScope){
$rootScope.userName = "Rezaul Hasan";
});

이제 앱 태그의 어느 위치에서나이 범위 변수를 바인딩 할 수 있습니다.


6

먼저 $ rootScope에 값을 다음과 같이 저장하십시오.

.run(function($rootScope){
$rootScope.myData = {name : "nikhil"}
})

.controller('myCtrl', function($scope) {
var a ="Nikhilesh";
$scope.myData.name = a;
});

.controller('myCtrl2', function($scope) {
var b = $scope.myData.name;
)}

$ rootScope는 모든 $ scope의 부모이며 각 $ scope는 $ scope 자체를 사용하여 액세스 할 수있는 $ rootScope 데이터의 복사본을받습니다.


3

"다른 컨트롤러에서 액세스"인 경우 각도 상수를 사용할 수 있습니다. 이점은 다음과 같습니다. 응용 프로그램 전체에서 액세스하려는 일부 전역 설정 또는 기타 항목을 추가 할 수 있습니다.

app.constant(‘appGlobals’, {
    defaultTemplatePath: '/assets/html/template/',
    appName: 'My Awesome App'
});

그런 다음 다음과 같이 액세스하십시오.

app.controller(‘SomeController’, [‘appGlobals’, function SomeController(config) {
    console.log(appGlobals);
    console.log(‘default path’, appGlobals.defaultTemplatePath);
}]);

(테스트하지 않았다)

자세한 정보 : http://ilikekillnerds.com/2014/11/constants-values-global-variables-in-angularjs-the-right-way/



1

이것을 달성하는 방법에는 여러 가지가 있습니다.

1. 추가 $rootScope.run방법

.run(function ($rootScope) {
    $rootScope.name = "Peter";
});

// Controller
.controller('myController', function ($scope,$rootScope) {
    console.log("Name in rootscope ",$rootScope.name);
    OR
    console.log("Name in scope ",$scope.name);
});

2. 하나의 서비스를 작성하고 두 제어기에서 모두 액세스하십시오.

.factory('myFactory', function () {
     var object = {};

     object.users = ['John', 'James', 'Jake']; 

     return object;
})
// Controller A

.controller('ControllerA', function (myFactory) {
    console.log("In controller A ", myFactory);
})

// Controller B

.controller('ControllerB', function (myFactory) {
    console.log("In controller B ", myFactory);
})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.