在angularjs$routeProvider中动态加载控制器
dynamically loading the controller in angularjs $routeProvider
我目前有一个内置路由的AngularJS应用程序,它可以完美地处理静态controller
属性分配。但我真正想做的是动态地分配具有不同路由的控制器:
$routeProvider
.when("/Dashboards/:dashboardName",{
templateUrl:function(params) {
return "Dashboards/" + params.dashboardName;
//some ASP.NET MVC calls to return partial views (this part works)
}
})
我想做的是在这里对我的controller
属性做同样的事情,比如:
$routeProvider
.when("/Dashboards/:dashboardName",{
templateUrl:function(params) {
return "Dashboards/" + params.dashboardName;
//some ASP.NET MVC calls to return partial views (this part works)
},
controller: function(params) {
return params.dashboardName+"Controller"; (this part DOESN'T work)
}
})
但似乎我得到了一个错误,说paramsProvider
没有找到
那么,有什么方法可以在路由配置中动态加载我的控制器函数名吗?
使用angular ui路由器可以做到这一点。
ui路由器允许您指定一个"controllerProvider"来指定用于提供控制器的函数。所以解决方案看起来是这样的:
$stateProvider
.state("/Dashboards/:dashboardName",{
templateUrl:function($stateParams) {
return "Dashboards/" + $stateParams.dashboardName;
},
controllerProvider: function($stateParams) {
return $stateParams.dashboardName+"Controller";
}
})
我希望它能有所帮助!
我解决了这个问题,没有在$routeProvider中指定控制器,而是将它放在templateURL中指定的文件中。
$routeProvider
.when("/Dashboards/:dashboardName",{
templateUrl:function(params) {
return "Dashboards/" + params.dashboardName;
}
})
在DashboardsNAME.html
中
<div class="container" ng-Controller='DashboardsNAMEController'>Food</div>
该技术仍然要求在实例化路由之前的某个时刻注册DashboardsNAMEController
。我怀疑最好的方法是在module.run()
方法中调用您自己的服务,但我在我的主控制器中这样做,因为它可以工作,而且无论如何都是一个短控制器。
我一直在尝试同样的事情。我发现的一个解决方案是在你的路线内这样做。提供者:
$routeProvider
.when("/Dashboards/:dashboardName",{
templateUrl:function(params) {
return "Dashboards/" + params.dashboardName;
},
controller: 'dynamicController'
});
然后计算在"dynamicController"定义中加载什么"伪控制器"(因为没有更好的名称)。
var controllers = {
unoController: function($scope, $routeParams, $rootScope) {
// Do whatever
},
dosController: function($scope, $routeParams, $rootScope) {
// Whatever for this controller
}
}
app.controller('dynamicController', ['$scope', '$routeParams', '$rootScope', function($scope, $routeParams, $rootScope) {
controllers[$routeParams.dashboardName+"Controller"]($scope, $routeParams, $rootScope);
}]);
这假设$routeParams.dashboardName是["uno","dos"]之一。
对此持谨慎态度,因为我在Angular上只呆了大约3天,但到目前为止,这种方法对我试图实现的目标非常有效。
我不知道它是否取决于AngularJS版本,但您可以为controller
属性提供一个函数,该函数将成为实际控制器。将这个事实与控制器继承结合使用,你可以获得一个更精简的代码,就像你想要的一样,我认为:
$routeProvider
.when("/Dashboards/:dashboardName",{
templateUrl:function(params) {
return "Dashboards/" + params.dashboardName;
},
controller: function($scope, $routeParams, $controller) {
/* this creates a child controller which,
if served as it is, should accomplish
your goal behaving as the actual controller
(params.dashboardName + "Controller") */
$controller($routeParams.dashboardName + "Controller", {$scope:$scope});
}
})
免责声明:我真的不知道这种方法是否有任何缺点。但看起来并不是这样。
这里有一些同样有效的东西(至少对我来说)。这可能会帮助未来的人们寻找答案。
$stateProvider
.state('foo', {
url: '/foo/:bar',
templateUrl: 'some-template-path.html',
resolve : {
getController : function($stateParams){
if ($stateParams.bar === "tab1") {
return "tab1Controller"
}else if ($stateParams.bar === "tab2") {
return "tab2Controller"
}else if ($stateParams.bar === "tab3"){
return "tab3Controller"
}else if ($stateParams.bar === "tab4") {
return "tab4Controller"
}
}
},
controllerProvider: function(getController){
return getController;
},
不是最短的代码,但至少更容易阅读。此外,如果要为controller
指定与tab/dashboardName名称不同的名称。
- 通过单击动态加载的表中同一行的另一个字段来更新一行的字段
- 如何根据对具有多行的先前列表的选择来动态加载下拉列表
- 动态加载和卸载js文件
- 动态加载angularjs并生成控制器和范围
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 动态加载fancybox并将其连接
- 对插件初始化后动态加载的元素进行样式设置
- 动态加载的自定义javascript/jQuery/HTML5音频播放器的问题
- UIWebview赢得't通过基本身份验证加载动态加载的资源(通过jQuery mobile)
- 使用jquery垂直对齐动态加载的图像
- 在动态加载的对话框中执行Javascript
- angularjs-bindng-click从jquery动态加载DOM
- 在动态加载的html中使用角度控制器
- 如何使用Javascript在FireFox中将html从内存动态加载到iframe中
- 使用systemJS的相对动态加载,使用ES6/Babel语法
- 为什么动态加载的事件在我的代码中不能正常工作
- 在不同的域上动态加载样式表;不适用于Firefox
- 在动态加载的PHP表单上放置JavaScript事件
- 在混合基本 URL 下动态加载 require.js 模块
- 动态加载引导模式主体