AngularJS-templateUrl을 생성 할 때 $ routeParams를 사용하는 방법은 무엇입니까?


96

우리 응용 프로그램에는 2 단계 탐색 기능이 있습니다. AngularJS를 사용 $routeProvider하여 <ng-view />. 나는 이것에 따라 무언가를 할 생각을하고 있었다.

angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/:primaryNav/:secondaryNav', {
        templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
    });
}]);

내에서 부품을 채우는 방법을 모르겠습니다 <<>>. primaryNav 및 secondaryNav가 $ routeParams에 바인딩된다는 것을 알고 있지만 템플릿을 동적으로 제공하기 위해 여기서 $ routeParams에 어떻게 액세스합니까?

답변:


84

나는 $routeParams서비스 를 주입하고 사용하는 방법을 찾을 수 없었습니다 (더 나은 해결책이 될 것이라고 생각합니다) 나는 이것이 효과가 있다고 생각했습니다.

angular.module('myApp', []).
    config(function ($routeProvider, $routeParams) {
        $routeProvider.when('/:primaryNav/:secondaryNav', {
            templateUrl: 'resources/angular/templates/nav/'+$routeParams.primaryNav+'/'+$routeParams.secondaryNav+'.html'
        });
    });

이 오류가 발생했습니다.

알 수없는 공급자 : myApp의 $ routeParams

이와 같은 것이 가능하지 않은 경우 다음과 같이 s를 사용하여 컨트롤러에서 URL을 설정 templateUrl하는 부분 HTML 파일을 가리 키도록 변경할 수 있습니다 .ng-include$routeParam

angular.module('myApp', []).
    config(function ($routeProvider) {
        $routeProvider.when('/:primaryNav/:secondaryNav', {
            templateUrl: 'resources/angular/templates/nav/urlRouter.html',
            controller: 'RouteController'
        });
    });

function RouteController($scope, $routeParams) {
        $scope.templateUrl = 'resources/angular/templates/nav/'+$routeParams.primaryNav+'/'+$routeParams.secondaryNav+'.html';
    }

이것으로 당신의 urlRouter.html

<div ng-include src="templateUrl"></div>

7
전자가 작동하지 않는 문제는 groups.google.com/forum/?fromgroups=#!topic/angular/qNi5lqm-Ps8 에 문서화되어 있습니다. config()공급자에게만 주입 대상 이 전달되므로 $routePrams.
nre

18
실제로 "한 줄 html 파일"을 만들 필요가 없습니다. "templateUrl"대신 "template :"키를 사용하고 html 한 줄짜리가 포함 된 문자열을 제공하면됩니다 ;-)
DominikGuzei

1
template대신 사용할 수 templateUrl없습니까?
kaiser 2013 년

1
이것은 실제로 작동하지만 선택한 각 템플릿에 컨트롤러를 적용하는 것은 어떻습니까? 이 방법을 사용하면 하나의 "마스터"컨트롤러와 함께 당신을 떠날 것이다 : "RouteController"
Yaniv에게 Efraim

9
template함수로 설정 하면 해당 함수 $routeParams로 전달할 수 있습니다 $routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });.. 그러나 이런 식으로 컨트롤러를 동적으로 정의 할 수는 없습니다. (
jacob

131

이 매우 유용한 기능은 이제 AngularJS 버전 1.1.2부터 사용할 수 있습니다. 불안정한 것으로 간주되지만 (1.1.3) 사용했으며 잘 작동합니다.

기본적으로 함수를 사용하여 templateUrl 문자열을 생성 할 수 있습니다. 이 함수에는 templateUrl 문자열을 빌드하고 반환하는 데 사용할 수있는 경로 매개 변수가 전달됩니다.

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

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id; }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);

풀 요청에 대해 https://github.com/lrlopez 에게 감사드립니다 .

https://github.com/angular/angular.js/pull/1524


5
이것은 이제 1.2에서 완전히 지원되며 아마도 가장 좋은 방법 일 것입니다 : docs.angularjs.org/api/ngRoute/provider/$routeProvider
Stu

매개 변수를 기반으로 한 동적 컨트롤러는 어떻습니까?
오크

제발, 제발 (제발!) 이것이 가능하다고 말 해주세요 controllers...?
Cody

이 경우 템플릿 ($ routeProvider에서 제공)에서 컨트롤러에 어떻게 액세스합니까? 일반적으로 컨트롤러가 ng-controller = "myController"지시문에 의해 바인딩 된 경우 myController를 myCtrl으로 참조 할 수 있습니다. 이 경우 myCtrl을 어떻게 정의합니까?
FlavorScape 2014-06-10

@FlavorScape 방금이 문제가 발생했습니다. 해결책은 $ routeProvider.when ( "/ foo", {controller : "FooController", controllerAs : "foo", templateUrl : "foo.html"});
Erin Drummond 2014 년

18

templateUrl은 생성 된 URL을 반환하는 함수로 사용할 수 있습니다. routeParams를받는 인수를 전달하여 URL을 조작 할 수 있습니다.

예를 참조하십시오.

.when('/:screenName/list',{
    templateUrl: function(params){
         return params.screenName +'/listUI'
    }
})

이 도움을 바랍니다.


7

알겠습니다. 알겠습니다 ...

약간의 배경 우선 : 이것이 필요한 이유는 Node Express 위에 Angular를 붙이고 Jade가 나를 위해 내 부분을 처리하도록하기 위해서였습니다.

그래서 여기에 할 일이 있습니다 ... (맥주를 마시고 먼저 20 시간 이상을 보내십시오 !!!) ...

모듈을 설정할 때 $routeProvider전역 적으로 저장하십시오 .

// app.js:
var routeProvider
    , app = angular.module('Isomorph', ['ngResource']).config(function($routeProvider){

        routeProvider = $routeProvider;
        $routeProvider
            .when('/', {templateUrl: '/login', controller: 'AppCtrl'})
            .when('/home', {templateUrl: '/', controller: 'AppCtrl'})
            .when('/login', {templateUrl: '/login', controller: 'AppCtrl'})
            .when('/SAMPLE', {templateUrl: '/SAMPLE', controller: 'SAMPLECtrl'})
            .when('/map', {templateUrl: '/map', controller: 'MapCtrl'})
            .when('/chat', {templateUrl: '/chat', controller: 'ChatCtrl'})
            .when('/blog', {templateUrl: '/blog', controller: 'BlogCtrl'})
            .when('/files', {templateUrl: '/files', controller: 'FilesCtrl'})
            .when('/tasks', {templateUrl: '/tasks', controller: 'TasksCtrl'})
            .when('/tasks/new', {templateUrl: '/tasks/new', controller: 'NewTaskCtrl'})
            .when('/tasks/:id', {templateUrl: '/tasks', controller: 'ViewTaskCtrl'})
            .when('/tasks/:id/edit', {templateUrl: '/tasks', controller: 'EditTaskCtrl'})
            .when('/tasks/:id/delete', {templateUrl: '/tasks', controller: 'DeleteTaskCtrl'})
        .otherwise({redirectTo: '/login'});

});

// ctrls.js
...
app.controller('EditTaskCtrl', function($scope, $routeParams, $location, $http){

    var idParam = $routeParams.id;
    routeProvider.when('/tasks/:id/edit/', {templateUrl: '/tasks/' + idParam + '/edit'});
    $location.path('/tasks/' + idParam + '/edit/');

});
...

필요한 것보다 더 많은 정보 일 수 있습니다 ...

  • 기본적 $routeProvider으로, 예를 들어 routeProvider컨트롤러에서 액세스 할 수 있도록 모듈의 var를 전역 적으로 저장하고 싶을 것 입니다.

  • 그런 다음 routeProvider새 경로를 사용 하고 만들 수 있습니다 ( '경로 재설정'/ '재 약속'할 수 없습니다. 새 경로를 만들어야 함). 마지막에 슬래시 (/)를 추가하여 의미 론적입니다. 첫 번째로.

  • 그런 다음 (컨트롤러 내부에서) templateUrl히트하려는 뷰로 설정하십시오 .

  • 무한 요청 루프가 발생하지 않도록 객체 의 controller속성을 제거하십시오 .when().

  • 마지막으로 (여전히 컨트롤러 내부에 있음) $location.path()방금 생성 된 경로로 리디렉션하는 데 사용합니다.

Angular 앱을 Express 앱에 겹치는 방법에 관심이 있다면 https://github.com/cScarlson/isomorph에서 내 저장소를 포크 할 수 있습니다 .

또한이 방법을 사용하면 WebSocket을 사용하여 HTML을 데이터베이스에 바인딩하려는 경우 AngularJS 양방향 데이터 바인딩을 유지할 수 있습니다. 그렇지 않으면이 방법이 없으면 Angular 데이터 바인딩은 {{model.param}}.

이 시점에서 이것을 복제하는 경우이를 실행하려면 컴퓨터에 mongoDB가 필요합니다.

이 문제가 해결되기를 바랍니다.

코디

목욕물을 마시지 마십시오.


3

라우터:-

...
.when('/enquiry/:page', {
    template: '<div ng-include src="templateUrl" onload="onLoad()"></div>',
    controller: 'enquiryCtrl'
})
...

제어 장치:-

...
// template onload event
$scope.onLoad = function() {
    console.log('onLoad()');
    f_tcalInit();  // or other onload stuff
}

// initialize
$scope.templateUrl = 'ci_index.php/adminctrl/enquiry/'+$routeParams.page;
...

$ routeParams가 라우터 내부에서 보이지 않는다는 것이 angularjs의 약점이라고 생각합니다. 작은 향상은 구현하는 동안 차이를 만들 것입니다.


3

내 각도 포크에 이에 대한 지원을 추가했습니다. 그것은 당신이 지정할 수 있습니다

$routeProvider
    .when('/:some/:param/:filled/:url', {
          templateUrl:'/:some/:param/:filled/template.ng.html'
     });

https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934

앵귤러에 대한 그레인에 반하기 때문에 이것이 선택 될지 확실하지 않지만 나에게 유용합니다


바로! Havent는 아직 사용했지만 정말 필요합니다. 주의해야 할 다른주의 사항이 있습니까? 또한 Angular가 그것을 구현하는 것에 대한 단어가 있습니까? -저는 CDN을 사용하고 싶습니다.
Cody

전혀 모르겠습니다. 저는 서류에 서명하지 않았기 때문에 막 다른 골목 이었지만 변경 사항을 가져 와서 직접 가져 오려고 할 수 있습니다 (이 작업을 수행했을 때 함께 있던 회사에서 더 이상 일하지 않습니다. angularjs 더 이상 추구)
Jamie Pate

좋습니다. 문제에 대한 정보와 기여에 감사드립니다. 잠시 후 문제를 해결해 보겠습니다.
Cody

1
//module dependent on ngRoute  
 var app=angular.module("myApp",['ngRoute']);
    //spa-Route Config file
    app.config(function($routeProvider,$locationProvider){
          $locationProvider.hashPrefix('');
          $routeProvider
            .when('/',{template:'HOME'})
            .when('/about/:paramOne/:paramTwo',{template:'ABOUT',controller:'aboutCtrl'})
            .otherwise({template:'Not Found'});
    }
   //aboutUs controller 
    app.controller('aboutCtrl',function($routeParams){
          $scope.paramOnePrint=$routeParams.paramOne;
          $scope.paramTwoPrint=$routeParams.paramTwo;
    });

index.html에서

<a ng-href="#/about/firstParam/secondParam">About</a>

firstParam 및 secondParam은 필요에 따라 무엇이든 될 수 있습니다.


0

비슷한 문제가 발생하여 $stateParams대신 사용 했습니다.routeParam

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