작성시 매개 변수를 AngularJS 컨트롤러에 전달할 수 있습니까?


278

사용자, 이름, 전자 메일 등의 속성을 업데이트하기 위해 API와 통신하는 컨트롤러가 있습니다. 각 사용자는 'id'프로필 페이지를 볼 때 서버에서 전달됩니다.

이 값을 AngularJS 컨트롤러에 전달하여 현재 사용자의 API 진입 점이 무엇인지 알 수 있습니다. 에 값을 전달하려고했습니다 ng-controller. 예를 들면 다음과 같습니다.

function UserCtrl(id, $scope, $filter) {

$scope.connection = $resource('api.com/user/' + id)

그리고 HTML에서

<body ng-controller="UserCtrl({% id %})">

여기서 {% id %}서버에서 보낸 ID를 인쇄하십시오. 하지만 오류가 발생합니다.

생성시 컨트롤러에 값을 전달하는 올바른 방법은 무엇입니까?


6
URL의 일부로 ID를 가지고 있다면 URL을 읽을 수 있습니다
akonsu

나는 매우 비슷한 문제가 있었고 내 대답에 게시 한대로 해결했습니다. 때로는 라이브러리를 사용하여 JavaScript 함수 호출의 간단한 기본 개념을 간과합니다.
Jigar Patel

@nickponline 21+ 이후에도 여전히 불가능하다고 생각하십니까?
om471987

답변:


362

노트:

이 답변은 오래되었습니다. 이것은 원하는 결과를 얻는 방법에 대한 개념 증명 일뿐입니다. 그러나 아래의 일부 의견에 따르면 최상의 솔루션이 아닐 수도 있습니다. 다음 방법을 지원하거나 거부 할 수있는 문서가 없습니다. 이 주제에 대한 자세한 설명은 아래 주석 중 일부를 참조하십시오.

원래 답변 :

나는 이것을 예라고 대답했다. 당신은 절대적 ng-init으로 간단한 init 함수를 사용하여 그렇게 할 수 있습니다 .

다음은 plunker 에 대한 예입니다.

HTML

<!DOCTYPE html>
<html ng-app="angularjs-starter">
  <head lang="en">
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
    <script src="app.js"></script>
  </head>  
  <body ng-controller="MainCtrl" ng-init="init('James Bond','007')">
    <h1>I am  {{name}} {{id}}</h1>
  </body>
</html>

자바 스크립트

var app = angular.module('angularjs-starter', []);

app.controller('MainCtrl', function($scope) {

  $scope.init = function(name, id)
  {
    //This function is sort of private constructor for controller
    $scope.id = id;
    $scope.name = name; 
    //Based on passed argument you can make a call to resource
    //and initialize more objects
    //$resource.getMeBond(007)
  };


});

5
이것에 감사합니다-많은 헤드 스크래칭을 절약하고 내 상황에 완벽하게 작동했습니다. 객체 ID로 컨트롤러를 초기화해야했는데 이것이 옳았습니다.
Masonoise

26
문서에서 :The only appropriate use of ngInit for aliasing special properties of ngRepeat, as seen in the demo below. Besides this case, you should use controllers rather than ngInit to initialize values on a scope.
Sergey Goliney

8
대답은이 접근법에 대한 의사의 권장 사항을 분명히하지만 누군가 문서가 공식 솔루션을 제공하는 위치를 알려 줄 수 있습니까?
Michael Pell

53
글쎄, 문서는 이유를 제시하지 않고이 접근법을 권장하지 않는 것으로 생각합니다. 나는 이것이 훌륭한 접근법이라고 생각합니다. 프레임 워크 작성자가 "틀린"방식으로 프레임 워크를 사용하지 않으려면 "틀린"방식으로 사용할 수 없어야하며 " 맞아요!
Shawn de Wet

2
경고 단어-스코프 값에 바인딩하려고하거나 실제로 컨트롤러 기능에 값이 존재할 것으로 예상되는 모든 작업을 수행하는 경우 이미 ng-init발생 하기 전에 컨트롤러 기능을 이미 실행 중입니다 -plnkr.co/edit
drzaus

143

나는 매우 늦게에있어이 좋은 아이디어 인 경우 나도 몰라,하지만 당신은 포함 할 수 $attrs컨트롤러 요소에 제공 "주장"을 사용하여 초기화 할 수 있도록 컨트롤러 기능에 주사를 예를

app.controller('modelController', function($scope, $attrs) {
    if (!$attrs.model) throw new Error("No model for modelController");

    // Initialize $scope using the value of the model attribute, e.g.,
    $scope.url = "http://example.com/fetch?model="+$attrs.model;
})

<div ng-controller="modelController" model="foobar">
  <a href="{{url}}">Click here</a>
</div>

다시 말하지만 이것이 좋은 아이디어인지는 모르겠지만 작동하는 것처럼 보이고 또 다른 대안입니다.


3
이 접근법을 사용하여 객체를 어떻게 전달합니까? var obj = {a : 1, b : 2};
Neil

3
하이브리드 앱 제작 문제에 대한 매우 합리적인 솔루션입니다.
superluminary

2
@ Neil : json 객체를 문자열 화 한 다음 컨트롤러 내부에서 구문 분석해야합니다. 더 좋은 해결책은 아니지만 효과가있을 수 있습니다. Michael의 솔루션은 문자열과 같은 매개 변수에 적합합니다.
M'sieur Toph

1
이 사용하는 것보다 실제로 더 신뢰할 ng-init- 전에 범위 값으로 바인드하려는 경우, 이미 컨트롤러 기능을 실행할 수있어 ng-init발생 - 볼 plnkr.co/edit/donCm6FRBSX9oENXh9WJ?p=preview을
drzaus

2
지시문 등을 사용하여 바퀴를 다시 발명하는 것은 아닙니다. 몇 가지 다른 초기화 매개 변수를 사용하여 여러보기에서 사용하려는 컨트롤러가있는 경우 가장 쉽고 안정적인 솔루션입니다.
Eric H.

39

이것은 또한 작동합니다.

자바 스크립트 :

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

app.controller('MainCtrl', function($scope, name, id) {
    $scope.id = id;
    $scope.name = name;
    // and more init
});

HTML :

<!DOCTYPE html>
<html ng-app="angularApp">
  <head lang="en">
    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.3/angular.min.js"></script>
    <script src="app.js"></script>
    <script>
       app.value("name", "James").value("id", "007");
    </script>
  </head>
  <body ng-controller="MainCtrl">
    <h1>I am  {{name}} {{id}}</h1>
  </body>
</html>

3
이것은 기존 생성자 주입 메커니즘과 함께 작동하는 좋은 솔루션입니다. 본질적으로 'name'과 'id'라는 두 개의 간단한 서비스를 만듭니다. 인젝터는 시공 중에 이름별로 일치시킵니다. 참조 : docs.angularjs.org/guide/providers
Todd

1
좋은. 이것은 문자열과 같은 기본 유형뿐만 아니라 객체에서도 작동합니다.
jbustamovej

이 솔루션이 더 좋습니다. 매개 변수 전달을 통해 중복 코드를 모듈화 할 수있었습니다. 건배!
agentpx

이것은 가장 관용적 인 방법처럼 보이지만 각도 팀이 권장하는 것은 확실하지 않습니다
VinGarcia

이것이 기본적으로 전역 키 / 값 쌍을 설정합니까? 지정된 컨트롤러 인스턴스로 범위를 지정하여 기본 컨트롤러 아래의 하위 컨트롤러에서만 선택할 수 있습니까? 그렇지 않다면 이것이 창 수준에서 일반 전역 Javascript 변수를 설정하는 것과 크게 다르지 않습니다.
jpierson

16

보기는 구성을 지시해서는 안됩니다

Angular에서 템플릿은 구성을 지시해서는 안되며, 이는 본질적으로 사람들이 템플릿 파일에서 컨트롤러에 인수를 전달하려고 할 때 원하는 것입니다. 미끄러운 경사가됩니다. 구성 설정이 지시문 또는 제어기 인수 속성과 같은 템플리트에 하드 코딩 된 경우 해당 템플리트를 더 이상 단일 용도 이외의 용도로 재사용 할 수 없습니다. 곧 해당 템플릿을 재사용하고 싶지만 구성이 다르므로 이제 템플릿을 사전 처리하여 변수가 각도에 전달되기 전에 변수를 주입하거나 거대한 지시문을 사용하여 거대하게 뱉어냅니다. 래퍼 div 및 인수를 제외하고 모든 컨트롤러 HTML을 재사용하십시오. 소규모 프로젝트의 경우 큰 문제가 아닙니다. 큰 것 (각도가 뛰어남)의 경우 추악합니다.

대안 : 모듈

이러한 유형의 구성은 모듈이 처리하도록 설계된 것입니다. 많은 앵귤러 튜토리얼에서 사람들은 전체 응용 프로그램을위한 단일 모듈을 가지고 있지만 실제로 시스템은 전체 응용 프로그램의 작은 조각을 포장하는 많은 작은 모듈을 설계하고 완벽하게 지원합니다. 이상적으로 컨트롤러, 모듈 등은 별도의 파일로 선언되어 재사용 가능한 특정 청크로 묶여 있습니다. 응용 프로그램이 이런 식으로 설계되면 쉬운 컨트롤러 인수 외에도 많은 재사용이 가능합니다.

아래 예에는 2 개의 모듈이 있으며 동일한 컨트롤러를 재사용하지만 각각 고유 한 구성 설정이 있습니다. 해당 구성 설정은을 사용하여 종속성 주입을 통해 전달됩니다 module.value. 생성자 의존성 주입, 재사용 가능한 컨트롤러 코드, 재사용 가능한 컨트롤러 템플릿 (ng-include에 컨트롤러 div를 쉽게 포함 할 수 있음), HTML없이 단위 테스트 가능한 시스템, 마지막으로 재사용 할 수 있기 때문에 이것은 각도 방식을 준수합니다 조각을 함께 바느질하는 차량으로 모듈.

예를 들면 다음과 같습니다.

<!-- index.html -->
<div id="module1">
    <div ng-controller="MyCtrl">
        <div>{{foo}}</div>
    </div>
</div>
<div id="module2">
    <div ng-controller="MyCtrl">
        <div>{{foo}}</div>
    </div>
</div>
<script>
    // part of this template, or a JS file designed to be used with this template
    angular.element(document).ready(function() {
        angular.bootstrap(document.getElementById("module1"), ["module1"]);
        angular.bootstrap(document.getElementById("module2"), ["module2"]);
    });
</script>

<!-- scripts which will likely in be in their seperate files -->
<script>
    // MyCtrl.js
    var MyCtrl = function($scope, foo) {
    $scope.foo = foo;
    }

    MyCtrl.$inject = ["$scope", "foo"];

    // Module1.js
    var module1 = angular.module('module1', []);
    module1.value("foo", "fooValue1");
    module1.controller("MyCtrl", MyCtrl);

    // Module2.js file
    var module2 = angular.module('module2', []);
    module2.value("foo", "fooValue2");
    module2.controller("MyCtrl", MyCtrl);
</script>

실제 동작 : jsFiddle 참조 .


나는 이미 공언했지만, 당신의 공헌에 감사를 표하고 싶습니다. 이 대답은 나를 더 나은 길로 이끌었습니다. 스택 오버플로는 사람들이 해킹 스 니펫뿐만 아니라 모범 사례를 공유 할 때 가장 좋습니다. "템플릿은 구성을 지시해서는 안됩니다. 이는 사람들이 템플릿 파일에서 컨트롤러로 인수를 전달할 때 원하는 기본 설정입니다." 문제의 중심에 레이저 비전을 가져 주셔서 감사합니다.
pestophagous

15

@akonsu와 나이젤 Findlater 제안처럼, 당신은 URL이 URL을 읽을 수 index.html#/user/:id로를 $routeParams.id그것은 컨트롤러 내부에 사용합니다.

앱 :

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

app.config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/:type/:id', {templateUrl: 'myView.html', controller: 'myCtrl'});
}]);

자원 서비스

app.factory('MyElements', ['$resource', function($resource) {
     return $resource('url/to/json/:type/:id', { type:'@type', id:'@id' });
}]);

컨트롤러

app.controller('MyCtrl', ['$scope', '$routeParams', 'MyElements', function($scope, $routeParams, MyElements) {
    MyElements.get({'type': $routeParams.type, "id": $routeParams.id }, function(elm) {
        $scope.elm = elm;
    })
}]);

다음에 elm따라보기에서 액세스 할 수 있습니다 id.


8

ng-init객체를 전달하지 않는 경우 $scope언제든지 자신의 지시문을 작성할 수 있습니다. 그래서 여기 내가 가진 것이 있습니다 :

http://jsfiddle.net/goliney/89bLj/

자바 스립 :

var app = angular.module('myApp', []);
app.directive('initData', function($parse) {
    return function(scope, element, attrs) {
        //modify scope
        var model = $parse(attrs.initData);
        model(scope);
    };
});

function Ctrl1($scope) {
    //should be defined
    $scope.inputdata = {foo:"east", bar:"west"};
}

HTML :

<div ng-controller="Ctrl1">
    <div init-data="inputdata.foo=123; inputdata.bar=321"></div>
</div>

그러나 내 접근 방식은 컨트롤러에서 이미 정의 된 객체 만 수정할 수 있습니다.


참고로 이것은 훌륭하게 작동하지만 현재 버전의 각도에서는 $ attrs (vs attrs)입니다.
Dinis Cruz

8

실제로 가장 좋은 해결책은 지시어입니다. 이를 통해 컨트롤러를 계속 사용할 수 있지만 사용자 정의 속성을 정의하십시오.

랩핑 범위의 변수에 액세스해야하는 경우이를 사용하십시오.

angular.module('myModule').directive('user', function ($filter) {
  return {
    link: function (scope, element, attrs) {
      $scope.connection = $resource('api.com/user/' + attrs.userId);
    }
  };
});

<user user-id="{% id %}"></user>

줄 바꿈 범위의 변수에 액세스 할 필요가없는 경우이를 사용하십시오.

angular.module('myModule').directive('user', function ($filter) {
  return {
    scope: {
      userId: '@'
    },
    link: function (scope, element, attrs) {
      $scope.connection = $resource('api.com/user/' + scope.userId);
    }
  };
});

<user user-id="{% id %}"></user>

7

$ routeProvider 유용한 변수를 전달하는 것을 발견했습니다.

예를 들어, 여러 화면에 하나의 컨트롤러 MyController를 사용하여 매우 중요한 변수 "mySuperConstant"를 내부에 전달합니다.

그 간단한 구조를 사용하십시오 :

Router:

$routeProvider
            .when('/this-page', {
                templateUrl: 'common.html',
                controller: MyController,
                mySuperConstant: "123"
            })
            .when('/that-page', {
                templateUrl: 'common.html',
                controller: MyController,
                mySuperConstant: "456"
            })
            .when('/another-page', {
                templateUrl: 'common.html',
                controller: MyController,
                mySuperConstant: "789"
            })

MyController:

    MyController: function ($scope, $route) {
        var mySuperConstant: $route.current.mySuperConstant;
        alert(mySuperConstant);

    }

6

예를 들어 경로를 설정할 때 할 수 있습니다

 .when('/newitem/:itemType', {
            templateUrl: 'scripts/components/items/newEditItem.html',
            controller: 'NewEditItemController as vm',
            resolve: {
              isEditMode: function () {
                return true;
              }
            },
        })

그리고 나중에 그것을

(function () {
  'use strict';

  angular
    .module('myApp')
    .controller('NewEditItemController', NewEditItemController);

  NewEditItemController.$inject = ['$http','isEditMode',$routeParams,];

  function NewEditItemController($http, isEditMode, $routeParams) {
    /* jshint validthis:true */

    var vm = this;
    vm.isEditMode = isEditMode;
    vm.itemType = $routeParams.itemType;
  }
})();

그래서 여기에 경로를 설정할 때 : itemType을 보내고 나중에 $ routeParams에서 검색합니다.



3

이 질문은 오래되었지만 오랜 시간 동안 내 요구에 맞는이 문제에 대한 답을 얻으려고 애썼지 만 쉽게 찾지 못했습니다. 나는이 질문이 처음 제기 된 이후 각도가 기능을 추가했기 때문에 다음 해결책이 현재 받아 들여진 것보다 훨씬 낫다고 생각합니다.

짧은 대답, Module.value 메소드를 사용하면 데이터를 컨트롤러 생성자로 전달할 수 있습니다.

내 plunker를 참조 하십시오

모델 객체를 만든 다음 모듈의 컨트롤러와 연결하여 'model'이라는 이름으로 참조합니다.

HTML / JS

  <html>
  <head>
    <script>
      var model = {"id": 1, "name":"foo"};

      $(document).ready(function(){
        var module = angular.module('myApp', []);
        module.value('model', model);
        module.controller('MyController', ['model', MyController]);
        angular.bootstrap(document, ['myApp']);
      });

      function confirmModelEdited() {
        alert("model name: " + model.name + "\nmodel id: " + model.id);
      }
    </script>

  </head>
  <body >
      <div ng-controller="MyController as controller">
        id: {{controller.model.id}} <br>
        name: <input ng-model="controller.model.name"/>{{controller.model.name}}
        <br><button ng-click="controller.incrementId()">increment ID</button>
        <br><button onclick="confirmModelEdited()">confirm model was edited</button>
    </div>
  </body>

</html>

내 컨트롤러의 생성자는 동일한 식별자 '모델'을 가진 매개 변수를 허용합니다.

제어 장치

function MyController (model) {
  this.model = model;
}

MyController.prototype.incrementId = function() {
  this.model.id = this.model.id + 1;
}

노트:

bootstrapping의 수동 초기화를 사용 하고 있으므로 모델을 각도로 보내기 전에 모델을 초기화 할 수 있습니다. 관련 데이터를 설정하고 필요할 때 필요할 때 앱의 각도 하위 집합 만 컴파일 할 수 있기 때문에 기존 코드와 훨씬 더 잘 어울립니다.

plunker에는 처음에 JavaScript로 정의되어 각도로 전달 된 모델 객체의 값을 경고하는 버튼이 추가되었습니다. 각도는 모델 객체를 복사하여 복사하는 것이 아니라 실제로 참조하는 것입니다.

이 줄에 :

module.controller('MyController', ['model', MyController]);

함수 인라인으로 선언하는 대신 MyController 객체를 Module.controller 함수에 전달하고 있습니다. 이것이 우리가 컨트롤러 객체를 훨씬 더 명확하게 정의 할 수 있다고 생각하지만 Angular 설명서는 인라인으로 처리하는 경향이 있으므로 설명이 필요하다고 생각했습니다.

"Controller as"구문을 사용하고 "$ scope"변수를 사용하는 대신 MyController의 "this"속성에 값을 할당합니다. 나는 이것이 $ scope를 사용하여 잘 작동한다고 생각합니다. 컨트롤러 할당은 다음과 같습니다.

module.controller('MyController', ['$scope', 'model', MyController]);

컨트롤러 생성자는 다음과 같은 서명을 갖습니다.

function MyController ($scope, model) {

어떤 이유로 든 원하는 경우이 모델을 두 번째 모듈의 값으로 연결 한 다음 기본 모듈에 대한 종속성으로 연결할 수 있습니다.

나는 그의 해결책이 현재 받아 들여진 것보다 훨씬 낫다고 믿는다.

  1. 컨트롤러에 전달 된 모델은 실제로 평가되는 문자열이 아닌 자바 스크립트 객체입니다. 이는 객체에 대한 참된 참조이며 변경 사항은이 모델 객체에 대한 다른 참조에 영향을줍니다.
  2. Angular는 허용 된 답변의 ng-init 사용이 오용 이며이 솔루션에서는 수행하지 않는다고 말합니다.

내가 본 다른 모든 예제에서 Angular가 작동하는 것처럼 보이는 것은 컨트롤러가 모델의 데이터를 정의하는 컨트롤러를 가지고 있습니다. 나에게 MVC. 이 솔루션을 사용하면 컨트롤러로 전달되는 완전히 별개의 모델 객체를 가질 수 있습니다. 또한 ng-include 지시문을 사용하면 모든 각도 HTML을 별도의 파일에 넣고 모델 뷰와 컨트롤러를 별도의 모듈로 분리 할 수 ​​있습니다.


2

angular-ui-router를 사용하는 경우 올바른 해결책입니다 : https://github.com/angular-ui/ui-router/wiki#resolve

기본적으로 컨트롤러를 인스턴스화하기 전에 "종속성"으로 종속 세트를 선언합니다. 각 "상태"에 대한 종속성을 선언 할 수 있습니다. 이러한 종속성은 컨트롤러의 "생성자"에 전달됩니다.


1

이를 수행하는 한 가지 방법은 공개 데이터 멤버 인 인수에 대해 '선박'으로 사용할 수있는 별도의 서비스를 사용하는 것입니다.


최고의 답변입니다. 또한 현재 일부 경우 F5를 감히 감수하는 사용자를 위해 브라우저 스토리지를 사용하므로이 상태가 유지됩니다.
Dormouse

1

특정 유스 케이스에 대한 솔루션은 마음에 들지 않았으므로 여기에서 보지 못했기 때문에 내가 한 일을 게시 할 것이라고 생각했습니다.

ng-repeat 루프 내에서 지시자와 같은 컨트롤러를 사용하고 싶었습니다.

<div ng-repeat="objParameter in [{id:'a'},{id:'b'},{id:'c'}]">
  <div ng-controller="DirectiveLikeController as ctrl"></div>
</div>

이제 objParameter각 DirectiveLikeController 내에서 생성 에 액세스하거나 언제든지 objParameter를 최신 상태로 유지하려면 $ scope를 삽입하고 호출하면됩니다 $scope.$eval('objParameter').

var app = angular.module('myapp', []);
app.controller('DirectiveLikeController',['$scope'], function($scope) {
   //print 'a' for the 1st instance, 'b' for the 2nd instance, and 'c' for the 3rd.
   console.log($scope.$eval('objParameter').id); 
});

내가 볼 수있는 유일한 단점은 상위 컨트롤러가 매개 변수의 이름을 알 필요가 있다는 것 objParameter입니다.


0

아니요, 불가능합니다. ng-init을 http://docs.angularjs.org/api/ng.directive:ngInit 해킹으로 사용할 수 있다고 생각합니다 .


4
나는달라고 간청하지만 ng-init 및 init fuction을 사용 하여이 작업을 수행 할 수 있습니다.
Jigar Patel

경고 단어-스코프 값에 바인딩하려고하거나 실제로 컨트롤러 기능에 값이 존재할 것으로 예상되는 작업을 수행하려는 경우 이미 ng-init발생 하기 전에 컨트롤러 기능을 이미 실행 중입니다 -plnkr.co/edit
drzaus

네 가능합니다. 최소한 데이터 매개 변수 등을 사용해야합니다. 그러나 확실히 가능합니다.
Juan

0

다음은 솔루션에 값을 전달하려고하지만 ng-init가 필요로하는 것처럼 HTML에서 컨트롤러를 명시 적으로 선언하지 않는 곳에서 작동하는 Marcin Wyszynski의 제안을 기반으로 한 솔루션입니다 (예 : ng-view로 템플릿을 렌더링하고 routeProvider를 통해 해당 경로에 대한 각 컨트롤러를 선언합니다.

JS

messageboard.directive('currentuser', ['CurrentUser', function(CurrentUser) {
  return function(scope, element, attrs) {
    CurrentUser.name = attrs.name;
  };
}]);

html

<div ng-app="app">
  <div class="view-container">
    <div ng-view currentuser name="testusername" class="view-frame animate-view"></div>
  </div>
</div>

이 솔루션에서 CurrentUser는 .name 속성을 사용하여 모든 컨트롤러에 주입 할 수있는 서비스입니다.

두 가지 메모 :

  • 내가 겪은 문제는 컨트롤러가로드 된 후 .name이 설정되어 해결 방법으로 컨트롤러 범위에서 사용자 이름을 렌더링하기 전에 짧은 시간 초과가 발생한다는 것입니다. 서비스에 .name이 설정 될 때까지 깔끔하게 기다리는 방법이 있습니까?

  • 이것은 모든 인증을 Angular 외부에 유지하면서 현재 사용자를 Angular 앱으로 가져 오는 매우 쉬운 방법처럼 느껴집니다. 로그인하지 않은 사용자가 Angular 앱이 부트 스트랩 된 html에 도착하는 것을 방지하기 위해 before_filter를 가질 수 있으며 해당 html 내에서 사용자의 세부 사항과 상호 작용하려는 경우 로그인 한 사용자의 이름과 심지어 ID를 보간 할 수 있습니다. Angular 앱의 http 요청을 통해. 로그인하지 않은 사용자가 기본 '게스트 사용자'와 함께 Angular 앱을 사용하도록 허용 할 수 있습니다. 이 방법이 나쁜 이유에 대한 조언은 환영받을 것입니다.


0

이것은 @Michael Tiller의 훌륭한 답변 입니다. 그의 대답은 $attrs객체를 컨트롤러 에 주입하여 뷰에서 변수를 초기화하는 데 효과적입니다 . $routeProvider라우팅으로 탐색 할 때 동일한 컨트롤러를 호출하면 문제가 발생합니다 . 그런 다음 뷰가 컴파일 될 때 주입에만 사용할 수 Unknown provider : $attrsProvider있기 때문에 인젝터 오류 $attrs가 발생합니다. 해결 방법은 $routeParams라우트 $attrs에서 컨트롤러를 초기화 할 때 와 보기에서 컨트롤러를 초기화 할 때 변수 (foo)를 전달하는 것 입니다. 여기 내 해결책이 있습니다.

노선에서

$routeProvider.
        when('/mypage/:foo', {
            templateUrl: 'templates/mypage.html',
            controller: 'MyPageController',
            caseInsensitiveMatch: true,
            resolve: {
                $attrs: function () {
                    return {};
                }
            }
        });

이 같은 URL을 처리합니다 '/mypage/bar'. 보시다시피 foo는 url 매개 변수에 의해 전달되며 인젝터 오류가 없도록 $injector빈 객체를 제공합니다 $attrs.

보기에서

<div ng-controller="MyPageController" data-foo="bar">

</div>

이제 컨트롤러

var app = angular.module('myapp', []);
app.controller('MyPageController',['$scope', '$attrs', '$routeParams'], function($scope, $attrs, $routeParams) {
   //now you can initialize foo. If $attrs contains foo, it's been initialized from view
   //else find it from $routeParams
   var foo = $attrs.foo? $attrs.foo : $routeParams.foo;
   console.log(foo); //prints 'bar'

});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.