我认为一种方法是使用服务来存储活动控制器的名称,甚至是要显示的菜单.每次视图更改时,控制器都将被执行,因此您可以运行一个功能来更新服务.
这是一个类似情况的小提琴,我正在使用一个菜单服务,为每个视图存储不同的菜单,该服务有一个setMenu()和getMenu(),每次执行一个控制器,它会通知服务哪个菜单是激活,每当我调用getMenu()时,它将返回活动菜单.
/* Services */
app.factory('Menu', function () {
var activeMenu;
var menu = {
home: '<button>A</button><button>B</button>',
list: '<button>C</button><button>D</button>',
settings: '<button>E</button><button>F</button>',
}
function setMenu(name) {
activeMenu = name;
}
function getActiveMenu() {
return menu[activeMenu];
}
return {
setMenu: setMenu,
getMenu : getActiveMenu
}
});
/* Controllers */
function HomeCtrl($scope, Menu) {
Menu.setMenu('home');
$scope.menu = Menu.getMenu();
}
function ListCtrl($scope, Menu) {
Menu.setMenu('list');
$scope.menu = Menu.getMenu();
}
function SettingsCtrl($scope, Menu) {
Menu.setMenu('settings');
$scope.menu = Menu.getMenu();
}
Run Code Online (Sandbox Code Playgroud)
我们可以.
网上有两个资源可以帮助我们解决这个问题:
因此,正如您所注意到的那样,问题只有在以下情况下才是可以接受的:"知道哪些控制器具有活动范围是有意义的",因为没有任何关于控制器生命周期本身的知识.
首先,定义一个RegisterableCtrl如下(我没有检查代码,它只是想知道如何实现它)
myApp.controller("RegisterableCtrl", function ($scope, ActiveScopesServices) {
// each time a scope is active this constructor will be called
ActiveScopesServices.add(...);
// each time a scope is removed this event receiver will be called
$scope.$on('$destroy', function dismiss() {
ActiveScopesServices.remove(...);
});
Run Code Online (Sandbox Code Playgroud)
});
然后,对于您的应用程序的每个控制器,注入注册功能,如下所示:
myApp.controller("MyCtrl2", function ($scope, ActiveScopesServices) {
//inject registrable behaviour
$injector.invoke(function ($controller) { $controller('RegisterableCtrl', {$scope: $scope});
//continue to normal code of your controller
});
Run Code Online (Sandbox Code Playgroud)
我们可以做得更好,因为我们必须在每个自定义控制器的开头调用$ injector.所以如果你想进一步看一下所谓的"AOP",面向方面的编程.这里已经有了这样的尝试:
https://github.com/mgechev/angular-aop
| 归档时间: |
|
| 查看次数: |
5556 次 |
| 最近记录: |