AngularJS,多条路由模板不同但控制器相同如何?
AngularJS, How about multiple routes with different templates but the same controller?
我正在调查我是否可以拥有标题所说的内容。
这是我的想法。
假设我有这条路线:
.when('/', {
templateUrl : 'partials/homepage.html',
})
.when('/test', {
templateUrl : 'partials/test.html',
})
.when('/page/:pageID', {
templateUrl : 'partials/page.html',
})
.when('/page/single/:pageID', {
templateUrl : 'partials/page-single.html',
})
直到现在,我还有机会在路线中添加 templateUrl 以及控制器详细信息,并且一切正常。
现在应用程序已更改,只有一个控制器包含所有需要的信息,并且必须保留一个控制器。路线将是这样的:
.when('/:templateName/:pageID', {
controller: 'myCtrl'
})
我可以通过获取 templateName 参数从控制器设置模板 ID 吗?如果是的话,最后一个路由示例 /page/single/:pageID 怎么样?我怎么知道路由中有第二个选项?
我可以使用 templateName 参数并查看它随 $routeChangeSuccess 方法的变化,但我找不到任何方法来动态设置模板。
有什么想法吗?
一种解决方案可能是以下一种:
angular.module('myapp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:templateName/:pageId', {
templateUrl: function(urlattr){
return '/pages/' + urlattr.templateName + '.html';
},
controller: 'YourCtrl'
});
}
]);
来自 AngularJs 1.3 文档:
templateUrl
– {string
|function()
} – path or function that returns a path to an html template that should be used by ngView.
If templateUrl is a function, it will be called with the following parameters:
Array.<Object>
- route parameters extracted from the current $location.path()
by applying the current route
我会将您的 singleton
逻辑从控制器移至服务。由于您没有提供太多代码,下面是一个示例,让您了解它是如何工作的。
app.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'partials/homepage.html',
controller: 'SingleController'
})
.when('/test', {
templateUrl: 'partials/test.html',
controller: 'SingleController'
})
.when('/page/:pageId', {
templateUrl: 'partials/page.html',
controller: 'SingleController'
});
});
app.provider('appState', function() {
this.$get = [function() {
return {
data: {}
};
}];
});
app.controller('SingleController', function ($scope, appState) {
$scope.data = appState.data;
});
但是如果它必须是一个单例控制器,你实际上可以在你的 ng-view
指令之前使用 ng-controller
指令,这样它就变成了一个 $rootScope
类似范围的所有视图。之后,只需在控制器的 $routeProvider 中添加空函数包装器即可。
我正在调查我是否可以拥有标题所说的内容。 这是我的想法。
假设我有这条路线:
.when('/', {
templateUrl : 'partials/homepage.html',
})
.when('/test', {
templateUrl : 'partials/test.html',
})
.when('/page/:pageID', {
templateUrl : 'partials/page.html',
})
.when('/page/single/:pageID', {
templateUrl : 'partials/page-single.html',
})
直到现在,我还有机会在路线中添加 templateUrl 以及控制器详细信息,并且一切正常。
现在应用程序已更改,只有一个控制器包含所有需要的信息,并且必须保留一个控制器。路线将是这样的:
.when('/:templateName/:pageID', {
controller: 'myCtrl'
})
我可以通过获取 templateName 参数从控制器设置模板 ID 吗?如果是的话,最后一个路由示例 /page/single/:pageID 怎么样?我怎么知道路由中有第二个选项?
我可以使用 templateName 参数并查看它随 $routeChangeSuccess 方法的变化,但我找不到任何方法来动态设置模板。
有什么想法吗?
一种解决方案可能是以下一种:
angular.module('myapp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:templateName/:pageId', {
templateUrl: function(urlattr){
return '/pages/' + urlattr.templateName + '.html';
},
controller: 'YourCtrl'
});
}
]);
来自 AngularJs 1.3 文档:
templateUrl
– {string
|function()
} – path or function that returns a path to an html template that should be used by ngView.If templateUrl is a function, it will be called with the following parameters:
Array.<Object>
- route parameters extracted from the current$location.path()
by applying the current route
我会将您的 singleton
逻辑从控制器移至服务。由于您没有提供太多代码,下面是一个示例,让您了解它是如何工作的。
app.config(function($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'partials/homepage.html',
controller: 'SingleController'
})
.when('/test', {
templateUrl: 'partials/test.html',
controller: 'SingleController'
})
.when('/page/:pageId', {
templateUrl: 'partials/page.html',
controller: 'SingleController'
});
});
app.provider('appState', function() {
this.$get = [function() {
return {
data: {}
};
}];
});
app.controller('SingleController', function ($scope, appState) {
$scope.data = appState.data;
});
但是如果它必须是一个单例控制器,你实际上可以在你的 ng-view
指令之前使用 ng-controller
指令,这样它就变成了一个 $rootScope
类似范围的所有视图。之后,只需在控制器的 $routeProvider 中添加空函数包装器即可。