如何在Angular中让两个控制器执行相同的操作,但改变站点的视觉效果
How to make two controllers perform same action in Angular, but change visual aspect of site?
我想在Angular中复制Google的主页功能,但这让我很苦恼。我已经看了Egghead的视频并阅读了整个API,但没有特定的例子来说明这种行为。我希望它做的是:
- 用户进入主页,显示主搜索栏和通用的黑色标题栏
- 用户搜索某些东西,只有当他按下"搜索"时,主搜索栏才会消失,url更改为mysite.com/q/searchTerm,新的子标题出现在黑色标题栏下,就像谷歌的主页一样,主搜索字段被删除并放置在主标题栏下的灰色栏中(如果你有即时搜索关闭)
- 搜索结果出现在现在消失的主搜索栏的位置,就像谷歌一样,但这部分我可以处理路由和视图。两个相同的控制器之间的布局切换是困扰我的。
到目前为止我试过的是:
- 为两个MainCtrl子控制器创建父控制器,并设置其作用域。data = {searchHeaderDisplay: false}
- 让两个子控制器共享相同的名称(MainCtrl),因为它们共享完全相同的功能
- 使标题栏中的ng-show="data "。searchHeaderDisplay"和主要的ng-hide="数据"。searchHeaderDisplay",然后尝试切换数据。搜索头显示在点击搜索按钮。
我还在学习AngularJS,所以我相信它很简单,我只需要一两个实际的例子来学习。
编辑:将次要标题(与较小的搜索字段)与搜索结果一起推入单独的视图模板,并且仅将根视图作为主要搜索字段会更好吗?文档对视图和路由的最佳实践非常宽松,尤其是那些有多个控制器的路由。如果我理解正确,您将scope.data = {searchHeaderDisplay: false}
设置在两个MainCtrl
控制器的父控制器上,目的是使MainCtrl
控制器共享相同的模型数据。没关系。
没有看到你的代码,我的猜测是,问题在于你如何切换data.searchHeaderDisplay
在ng-click。您可以在子作用域级别设置data.searchHeaderDisplay
(例如:(与MainCtrl
控制器对应的范围),当您应该将值分配给它们的父范围级别时。如果您需要我详细说明,请告诉我。
更新:
查看所提供的代码后,问题确实与我之前(上面)所怀疑的一样。
mainProductSearch()
是需要改变的。由于前面简要说明的原因,您需要scope.$parent.data.searchHeaderVisible = true
而不是scope.data.searchHeaderVisible = true;
。如果你仍然不清楚背后的原理,那么你可能需要熟悉AngularJS作用域(和/或Javascript对象)的原型继承链。作用域原型继承是AngularJS的重要组成部分。
而不是AppCtrl(本质上就像$rootScope),并使用$parent
(这是一个脆弱的解决方案,因为改变HTML结构可能会导致这打破-例如,你可能会发现你需要使用$parent.$parent...
,如果你添加一个中间的ng控制器),我建议一个服务来存储与你的头相关的模型数据。我们叫它searchService
。
需要影响该模型的控制器可以注入服务。这还有一个额外的好处,那就是依赖关系是清晰的(与controller $scope继承相比,后者的依赖关系是不清晰的)。例如,当用户按下"search"时,控制器可以调用服务上定义的通知方法:searchService.newSearchTerm(searchTerm)
。现在,所有监视模型变化的视图(如标题视图)都将注意到变化,并可以相应地更新。
您可以考虑使用ng-view作为页面的主要内容区域。
参见https://stackoverflow.com/a/14619122/215945,那里讨论了一个非常相似的布局。在那个SO帖子中,标题中有一个带有商品计数的购物篮。item count需要被多个控制器更新,所以我们把它放到一个service中。
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 如何确定javascript已经完成了某些操作.ios上的
- 防止Alt+Shift默认操作或检测多种操作系统语言的Javascript
- 从JavaScript访问struts操作中的属性
- fluxxor向一个flux实例添加一组以上的操作
- Jquery表单验证插件-如果选中复选框,如何在提交时执行某些操作
- 操作放置在画布上的元素之间的连接
- 使用“+="操作人员
- Rails操作只调用一次,但我在ajax中每秒钟都调用一次
- 改变“;onClick"这个jQuery的操作从清除输入文本改为将输入文本添加到下面的列表中
- 这是关于Jquery/JS的,如果我改变元素's HTML-我可以对它执行其他Jquery/JS操作吗
- Dom 字符串在使用 jQuery attr 操作后不会改变
- 我希望我的操作改变它所附加的DOM元素
- 在套接字中发送文件.在不改变用户窗口位置的情况下执行IO操作
- 在redux状态改变后处理不纯的DOM操作
- 如何在Angular中让两个控制器执行相同的操作,但改变站点的视觉效果
- 测试一个Node.js函数,该函数的返回值可以根据执行异步操作的时刻而改变
- 操作jQuery对象而不改变html元素