在Blur-Admin框架中实现控制器间数据传递的Service定义指引
我刚好熟悉Blur-Admin的结构,针对你要在Dashboard模块的两个控制器间共享数据的需求,Service的定义其实非常清晰,完全可以贴合框架的模块化设计来做,具体步骤如下:
1. 确定Service的存放位置
因为你的需求是Dashboard模块内部的控制器/指令间共享数据,所以最佳实践是把Service定义在Dashboard模块内部,而不是全局的根模块里。这样既不会污染全局命名空间,也符合Blur-Admin按功能划分模块的设计思路。
你可以在Dashboard模块目录下新建一个文件,比如 dashboard.shared.service.js,位置建议和模块文件、控制器文件同级,或者单独建一个shared子目录来存放这类共享服务,让结构更规整。
2. 编写Service的具体实现
在新建的Service文件里,把它注册到BlurAdmin.pages.dashboard模块下(和你的Dashboard控制器、指令属于同一个模块),示例代码如下:
// dashboard/dashboard.shared.service.js angular.module('BlurAdmin.pages.dashboard') .service('DashboardSharedService', function() { // 初始化共享数据容器 let _sharedStore = { userStats: {}, recentActivity: [] }; // 获取全部共享数据 this.getSharedStore = function() { return _sharedStore; }; // 更新共享数据(支持部分更新) this.updateSharedStore = function(newData) { angular.extend(_sharedStore, newData); }; // 也可以针对特定业务场景封装单独的方法 this.addRecentActivity = function(activity) { _sharedStore.recentActivity.unshift(activity); // 限制条数,避免数据过多 if (_sharedStore.recentActivity.length > 10) { _sharedStore.recentActivity.pop(); } }; this.getRecentActivity = function() { return _sharedStore.recentActivity; }; });
3. 在控制器中注入并使用Service
接下来,在需要共享数据的两个控制器里,注入刚才定义的DashboardSharedService,就可以实现数据互通了:
第一个控制器(比如负责更新数据的控制器)
angular.module('BlurAdmin.pages.dashboard') .controller('DashboardStatsCtrl', function($scope, DashboardSharedService) { // 模拟数据更新场景 $scope.refreshStats = function() { let newStats = { userCount: Math.floor(Math.random() * 500), onlineUsers: Math.floor(Math.random() * 100) }; // 更新共享数据 DashboardSharedService.updateSharedStore({ userStats: newStats }); }; // 模拟添加活动记录 $scope.addNewActivity = function() { DashboardSharedService.addRecentActivity({ time: new Date().toLocaleString(), content: '用户完成了一次数据刷新' }); }; });
第二个控制器(比如负责展示数据的控制器)
angular.module('BlurAdmin.pages.dashboard') .controller('DashboardDisplayCtrl', function($scope, DashboardSharedService) { // 监听共享数据的变化,实时更新视图 $scope.$watch( () => DashboardSharedService.getSharedStore(), (newStore) => { $scope.currentStats = newStore.userStats; $scope.activityList = newStore.recentActivity; }, true // 开启深度监听,确保对象内部属性变化能被捕获 ); // 初始化时获取初始数据 $scope.currentStats = DashboardSharedService.getSharedStore().userStats; });
4. 确保Service文件被正确加载
最后一步,要确保你的Service文件被加载到页面中。如果是手动引入,在index.html里找到Dashboard模块相关的script标签,在控制器文件之前引入Service文件:
<script src="app/pages/dashboard/dashboard.module.js"></script> <script src="app/pages/dashboard/dashboard.shared.service.js"></script> <script src="app/pages/dashboard/dashboard-stats.controller.js"></script> <script src="app/pages/dashboard/dashboard-display.controller.js"></script>
如果用了构建工具(比如BlurAdmin自带的Gulp),只要把Service文件放在Dashboard目录下,构建脚本会自动把它打包到对应的模块文件里,不用手动处理。
额外说明
如果以后需要跨多个模块共享数据,才需要把Service注册到根模块BlurAdmin下,但针对你当前的Dashboard内部需求,放在模块内部是最合理的选择,既清晰又便于维护。
内容的提问来源于stack exchange,提问作者madu

