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

사용자, 이름, 전자 메일 등의 속성을 업데이트하기 위해 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를 인쇄하십시오. 하지만 오류가 발생합니다.

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



답변

노트:

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

원래 답변 :

나는 이것을 예라고 대답했다. 당신은 절대적 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)
  };


});


답변

나는 매우 늦게에있어이 좋은 아이디어 인 경우 나도 몰라,하지만 당신은 포함 할 수 $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>

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


답변

이것은 또한 작동합니다.

자바 스크립트 :

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>


답변

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

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 참조 .


답변

@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.


답변

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>

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


답변

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

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

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>