AngularJS 다이내믹라우팅
나는 현재 Angular를 가지고 있다.루팅을 내장한 JS 어플리케이션효과가 있고 모든 것이 정상입니다.
내 app.js 파일은 다음과 같습니다.
angular.module('myapp', ['myapp.filters', 'myapp.services', 'myapp.directives']).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/', { templateUrl: '/pages/home.html', controller: HomeController });
$routeProvider.when('/about', { templateUrl: '/pages/about.html', controller: AboutController });
$routeProvider.when('/privacy', { templateUrl: '/pages/privacy.html', controller: AboutController });
$routeProvider.when('/terms', { templateUrl: '/pages/terms.html', controller: AboutController });
$routeProvider.otherwise({ redirectTo: '/' });
}]);
내 앱에는 /pages 디렉토리에 새로운 html 파일을 복사하고 추가할 수 있는 CMS가 내장되어 있습니다.
새로 동적으로 추가된 파일이라도 라우팅 공급자를 통해 확인하고 싶습니다.
이상적인 세계에서 라우팅 패턴은 다음과 같습니다.
$route Provider.when('/pagename', { templateUrl: '/pagename').html', 컨트롤러: CMS Controller } ;
그래서 새로운 페이지명이 contact.html이면 angular로 "/contact"를 선택하여 "/pages/contact.html"로 리다이렉트하고 싶습니다.
이게 가능하기나 해?그렇다면 어떻게?!
갱신하다
라우팅 설정에는 다음과 같은 것이 있습니다.
$routeProvider.when('/page/:name', { templateUrl: '/pages/home.html', controller: CMSController })
CMS Controller에서 다음을 수행합니다.
function CMSController($scope, $route, $routeParams) {
$route.current.templateUrl = '/pages/' + $routeParams.name + ".html";
alert($route.current.templateUrl);
}
CMSController.$inject = ['$scope', '$route', '$routeParams'];
그러면 현재 templateUrl이 올바른 값으로 설정됩니다.
단, ng-view를 새로운 templateUrl 값으로 변경하고 싶습니다.어떻게 하면 될까요?
angular.module('myapp', ['myapp.filters', 'myapp.services', 'myapp.directives']).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/page/:name*', {
templateUrl: function(urlattr){
return '/pages/' + urlattr.name + '.html';
},
controller: 'CMSController'
});
}
]);
- * 를 추가하면 여러 수준의 디렉토리를 동적으로 작업할 수 있습니다.예: /page/cars/selling/list가 이 프로바이더에서 포착됩니다.
문서(1.3.0):
templateUrl이 함수일 경우 다음 파라미터로 호출됩니다.
{Array.} - 현재 경로를 적용하여 현재 $location.path()에서 추출된 경로 매개 변수"
또한.
when(path, route): 메서드
- 경로에는 콜론으로 시작하여 별(예:name*)로 끝나는 이름 있는 그룹을 포함할 수 있습니다.모든 문자는 루트가 일치할 때 지정된 이름으로 $routeParams에 저장됩니다.
그래, 해결했어.
GitHub에 솔루션 추가 - http://gregorypratt.github.com/AngularDynamicRouting
내 app.js 라우팅 구성에서:
$routeProvider.when('/pages/:name', {
templateUrl: '/pages/home.html',
controller: CMSController
});
다음으로 CMS 컨트롤러에서 다음을 수행합니다.
function CMSController($scope, $route, $routeParams) {
$route.current.templateUrl = '/pages/' + $routeParams.name + ".html";
$.get($route.current.templateUrl, function (data) {
$scope.$apply(function () {
$('#views').html($compile(data)($scope));
});
});
...
}
CMSController.$inject = ['$scope', '$route', '$routeParams'];
를 #views로 <div id="views" ng-view></div>
표준 라우팅 및 다이내믹라우팅으로 동작하게 되었습니다.
나는 portfolio 약.해, 소아마비를 입력했습니다.html이라고 불리는.html에 대해 복사하고, 그것의 내용 중 일부를 변경하여 입력했다./#/pages/portfolio
portfolio되었습니다.
갱신필 동적 콘텐츠를 삽입할 수 있도록 html에 $apply 및 $compile을 추가했습니다.
예를 들어 json을 통해 경로를 확인하는 등 나중에 경로를 해결하는 것이 가장 쉬운 방법이라고 생각합니다.설정 단계에서 $routeProvider에서 $provider를 사용하여 팩토리를 만들면 실행 단계에서도 컨트롤러에서도 $routeProvider 개체를 계속 사용할 수 있습니다.
'use strict';
angular.module('myapp', []).config(function($provide, $routeProvider) {
$provide.factory('$routeProvider', function () {
return $routeProvider;
});
}).run(function($routeProvider, $http) {
$routeProvider.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
}).otherwise({
redirectTo: '/'
});
$http.get('/dynamic-routes.json').success(function(data) {
$routeProvider.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
});
// you might need to call $route.reload() if the route changed
$route.reload();
});
});
URI변수할 수 .$ routeProvider URI の 음음음음 。$routeProvider.when('/page/:pageNumber' ...
$routeParams $ $ $ 。
$route 페이지 끝에 좋은 예가 있습니다.http://docs.angularjs.org/api/ng.$route
편집(편집된 질문의 경우):
안타깝게도 라우팅 시스템은 매우 한정되어 있습니다.이 주제에 대해서는 많은 논의가 이루어지고 있으며, 여러 개의 명명된 뷰를 작성하는 등 몇 가지 솔루션이 제안되고 있습니다.단, 현시점에서는 ngView 디렉티브는 1대 1로 루트당1개의 뷰만 제공합니다. 가지 할 수 . 더 입니다. 뷰 은 로더로 사용할 수 .<ng-include src="myTemplateUrl"></ng-include>
120.)y「yTemplateUrl」을 참조해 주세요.
저는 보다 복잡한(그러나 더 크고 복잡한 문제에 대해서는 더 깔끔한) 솔루션을 사용하고 있습니다.기본적으로 $route 서비스는 모두 생략합니다.상세한 내용은 다음과 같습니다.
이것이 동작하는 이유는 불명확합니다만, 각 1.2.0~rc.2 로 다이내믹(또는 와일드카드) 루트를 사용할 수 있습니다.
http://code.angularjs.org/1.2.0-rc.2/angular.min.js
http://code.angularjs.org/1.2.0-rc.2/angular-route.min.js
angular.module('yadda', [
'ngRoute'
]).
config(function ($routeProvider, $locationProvider) {
$routeProvider.
when('/:a', {
template: '<div ng-include="templateUrl">Loading...</div>',
controller: 'DynamicController'
}).
controller('DynamicController', function ($scope, $routeParams) {
console.log($routeParams);
$scope.templateUrl = 'partials/' + $routeParams.a;
}).
example.com/foo -> "foo" 부분 로드
example.com/bar- > "bar" 부분 로드
ng뷰를 조정할 필요가 없습니다.'/:a' 대소문자가 이 문제를 해결할 수 있는 유일한 변수입니다.'/:foo'는 모든 부분 foo1, foo2 등이 아니면 작동하지 않습니다.'/:a'는 모든 부분 이름과 함께 작동합니다.
모든 값에 의해 다이내믹 컨트롤러가 기동됩니다.따라서 "다른 방법"은 없습니다.다이나믹 또는 와일드카드 라우팅 시나리오에서 필요한 것은 이것이라고 생각합니다.
AngularJS 1.1.3에서는 새로운 catch-all 파라미터를 사용하여 원하는 작업을 정확하게 수행할 수 있습니다.
https://github.com/angular/angular.js/commit/7eafbb98c64c0dc079d7d3ec589f1270b7f6fea5
커밋부터:
이것에 의해, 콜론 대신에 아스타리스크가 부가되어 있는 경우, 슬래시가 포함되어 있는 경우에서도, routeProvider 는 서브스트링에 일치하는 파라미터를 받아들일 수 있습니다.를 들어, '다'와 같은 루트가 있습니다.
edit/color/:color/largecode/*largecode
와 같은http://appdomain.com/edit/color/brown/largecode/code/with/slashs
.
(1.1.5를 사용하여) 직접 테스트해 본 결과, 동작은 동작합니다.새로운 URL이 새로고침될 때마다 컨트롤러가 새로고침되므로 모든 상태를 유지하려면 커스텀서비스를 사용해야 할 수도 있습니다.
여기 도움이 되는 또 다른 해결책이 있습니다.
(function() {
'use strict';
angular.module('cms').config(route);
route.$inject = ['$routeProvider'];
function route($routeProvider) {
$routeProvider
.when('/:section', {
templateUrl: buildPath
})
.when('/:section/:page', {
templateUrl: buildPath
})
.when('/:section/:page/:task', {
templateUrl: buildPath
});
}
function buildPath(path) {
var layout = 'layout';
angular.forEach(path, function(value) {
value = value.charAt(0).toUpperCase() + value.substring(1);
layout += value;
});
layout += '.tpl';
return 'client/app/layouts/' + layout;
}
})();
언급URL : https://stackoverflow.com/questions/13681116/angularjs-dynamic-routing
'programing' 카테고리의 다른 글
Wordpress 사용자 목록에서 특정 관리자 계정 숨기기 (0) | 2023.02.26 |
---|---|
여러 어레이가 있는 JSON 개체를 만들려면 어떻게 해야 합니까? (0) | 2023.02.26 |
Java에서 Jackson JSON 역직렬화 중 누락된 속성 무시 (0) | 2023.02.26 |
WebMvc 주석 의미 사용 (0) | 2023.02.26 |
AngularJS - 각 루트 및 컨트롤러에서의 로그인 및 인증 (0) | 2023.02.26 |