Javascript 角度,访问ng视图包装div之外的范围
我正在尝试在我的应用程序上设置自定义主题,因此我所做的是让用户选择某些主题,这将全面更改应用程序主题。我有一个服务,它发送一段json,并监听它在每个视图的控制器中的变化。现在,这在视图本身中可以很好地工作——这里有一些工作代码片段供参考 我的工厂控制着这个主题-Javascript 角度,访问ng视图包装div之外的范围,javascript,html,css,angularjs,Javascript,Html,Css,Angularjs,我正在尝试在我的应用程序上设置自定义主题,因此我所做的是让用户选择某些主题,这将全面更改应用程序主题。我有一个服务,它发送一段json,并监听它在每个视图的控制器中的变化。现在,这在视图本身中可以很好地工作——这里有一些工作代码片段供参考 我的工厂控制着这个主题- angular.module('demoApp') .factory('templatingFactory', function () { var meaningOfLife = { 'h1': '
angular.module('demoApp')
.factory('templatingFactory', function () {
var meaningOfLife =
{
'h1': '#ea6060',
'bg': '#ffffff'
};
return {
setTheme: function(theme) {
meaningOfLife = theme;
},
getTheme: function() {
return meaningOfLife;
}
};
});
我的一个示例控制器显示和更改主题(并侦听更改)
然后在模板/视图本身上,我做了如下操作-
<h3 ng-style="{ 'color' : themeStore.h1 }">Title</h3>
标题
因此,我的问题是,这在视图中运行良好。但是,ng视图标记位于主体内部,外部是主体容器,以及我希望能够与此主题对象挂钩的页眉和页脚菜单。所以我的问题是,有没有办法在ng视图之外使用这个范围?我不认为这是可能的,但我不确定我如何访问并在页眉、页脚和正文上放置ng样式,以使用我正在使用的方法更改某些css
因此,对于一个简单的参考,它看起来像这样-
<body ng-app="myApp">
<div class="container">
<div class="header" ng-style="{ 'background-color' : themeStore.bg }">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<i class="fa fa-bars"></i>
</button>
<div class="headerLogo"></div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
</ul>
</div>
</div>
<div ng-view class="velocity-opposites-transition-slideUpIn" data-velocity-opts="{ duration: 500 }" ng-style="{ 'background-color' : themeStore.bg }"> </div>
<div class="footer">
<p></p>
</div>
</div>
</body>
正如你所看到的,我正试图钩住页眉来改变背景色,但不是这样。不过我注意到,如果我把它放在ng view div上,它就可以正常工作了
我将非常感谢任何意见,因为我已经在这方面停留了一段时间。感谢您抽出时间阅读 您的
ng视图之外的DOM元素必须有自己的控制器,并且templatingFactory
作为依赖项注入
首先,我将修改html,如下所示:
<div class="header" ng-controller="headerController" ng-style="{ 'background-color' : themeStore.bg }">
一个更可重用的解决方案是创建一个指令,将此控制器功能添加到它应用到的任何DOM元素中,但上面的内容更直接。我认为将角度函数和变量置于ui视图或ng视图之外的最佳方法是使用全局服务。在这种情况下,您应该在“templatingFactory”中执行主题化逻辑。然后将此服务注入模块,而不是控制器
angular.module('demoApp').run(['$rootScope', 'templatingFactory', function($rootScope, templatingFactory){
$rootScope.templatingService = templatingFactory;
}]);
因此,您的服务将在$rootScope中可用。现在你可以这样使用它了
<body ng-app="myApp">
<div class="container">
<div class="header" ng-style="{ 'background-color' : templatingService.getTheme().bg }"> </div>
</div>
</div>
ps:我在角度方面也是比较新的,所以我对好的/错误的做法一无所知 对于指令方法,一个简单的示例可能如下所示:
demoApp.directive('themeHeader', function (templatingFactory) {
return {
restrict: 'A',
link : function (scope, element, attrs) {
scope.$watch(templatingFactory.getTheme, function () {
element.css('background-color', newTheme.bg);
});
}
}
});
<div theme-header>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><i class="fa fa-bars"></i></button>
<div class="headerLogo"></div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right"></ul>
</div>
html将如下所示:
demoApp.directive('themeHeader', function (templatingFactory) {
return {
restrict: 'A',
link : function (scope, element, attrs) {
scope.$watch(templatingFactory.getTheme, function () {
element.css('background-color', newTheme.bg);
});
}
}
});
<div theme-header>
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse"><i class="fa fa-bars"></i></button>
<div class="headerLogo"></div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right"></ul>
</div>
我对angular还不熟悉,所以可能有点离题,但我想这个问题可能会对你有所帮助:@coopersta非常感谢你的回答!我遇到的问题实际上不是在控制器之间传递,我可以使用工厂保存,它在所有控制器中都能很好地工作,它在视图外部访问以标记到标题上,等等(不在视图内部)您可能需要在标头上添加第二个指令,用于监视templatingFactory服务并根据getTheme()返回的内容更新其视图。@Jase非常有趣!我从来没有做过这样的事情,你能举个例子说明这样的事情是如何运作的吗?谢谢在body标签的顶层有一个outter控制器怎么样。让那个控制者负责这个主题。然后,内部控制器可以引用$rootScope.XXX以获取上层控制器中的值。