我想知道如何为单个页面应用程序使用多个控制器 . 我试图解决这个问题并且我发现了与我的问题非常相似的问题,但是解决特定问题的答案很多,最终你没有为单个页面应用程序使用多个控制器 .
那是因为对一个页面使用多个控制器是不明智的吗?或者它是不可能的?
假设我已经有一个kick-ass图像轮播控制器在主页面上工作,但后来我学会了如何(让我们说)使用模态,我也需要一个新的控制器(或者我需要一个控制器的任何其他东西) . 那我该怎么办?
我已经看到了其他问题的一些答案,他们问我几乎和我一样的事情,人们回答“* OMG . 你为什么要这样做,就这样做......” .
什么是最好的方式,或者你是如何做到的?
Edit
你们中的许多人正在回答声明两个控制器,然后使用ng-controller来调用它 . 我在下面使用这段代码然后用ng-controller调用MainCtrl .
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
如果我可以在没有它的情况下使用ng-controller,为什么我甚至需要在这里设置一个控制器呢?这让我很困惑 . (你不能这样添加两个控制器,我想...)
7 回答
问题是什么?要使用多个控制器,只需使用多个ngController指令:
像往常一样,您需要在应用程序模块中使用控制器 .
最基本的方法可能就像声明控制器函数一样简单:
我认为你错过了“单页应用”的含义 .
这并不意味着你将有一个.html,而是你将有一个主
index.html
和几个NESTED .html文件 . 那么为什么单页应用呢?因为这样您不会以标准方式加载页面(即完全刷新整页的浏览器调用),而只是使用Angular / Ajax加载内容部分 . 由于您没有看到页面更改之间的闪烁,因此您会觉得您没有从页面移动 . 因此,您觉得您只是呆在一个页面上 .现在,我假设您想为您的SINGLE PAGE应用程序提供多个内容:(例如)家庭,联系人,投资组合和商店 . 您的单页/多内容应用(角度方式)将以这种方式组织:
index.html
:包含 Headers ,<ng-view>
和页脚contacts.html
:包含联系表单(无 Headers ,无页脚)portfolio.html
:包含投资组合数据(无 Headers 无页脚)store.html
:包含商店,没有 Headers 没有页脚 .你在索引中,你点击名为"contacts"的菜单,会发生什么? Angular用
contacts.html
代码替换<ng-view>
标记你是如何实现这一目标的?和
ngRoute
一样,你会有类似的东西:这将调用正确的html传递正确的控制器(请注意: do not specify ng-controller directive in contacts.html if you are using routes )
然后,当然,您可以在contacts.html页面中声明尽可能多的ng-controller指令 . 那些将是
ContactCtrl
的子控制器(因此继承它) . 但是对于单个路径,在routeProvider
内,您可以声明一个将充当"Father controller of the partial view"的Controller .编辑想象一下以下模板/ contacts.html
上面的
routeProvider
会将控制器注入你的包含div . 基本上上面的html自动变成:当我说你可以拥有其他控制器时,意味着你可以将控制器插入内部DOM元素,如下所示:
我希望这会澄清一些事情 .
一个
我目前正在构建单页面应用程序 . 到目前为止,我认为这将是回答你的问题 . 我有一个基本模板(base.html),其中包含一个带有
ng-view
指令的div . 这个指令告诉angular将新内容放在哪里 . 注意我自己是angularjs的新手,所以我绝不是说这是最好的方法 .base.html文件
menuController可以访问菜单div . 并且widgetController可以访问这两者 .
我只是简单地声明了应用程序
然后我构建了一个服务和两个控制器
对于每个控制器,我在JS中有一条线
在HTML中,我在周围的div中声明了应用范围
并且每个控制器的范围分别在它们自己的周围div中app div)
这很好
我们可以简单地在同一个模块中声明多个Controller . 这是一个例子:
您还可以将所有模板视图嵌入到主html文件中 . 例如:
这样,如果每个模板需要不同的控制器,那么您仍然可以使用角度路由器 . 请参阅此插件以获取工作示例http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
这样一旦应用程序从服务器发送到您的客户端,它就完全自包含,假设它不需要发出任何数据请求等 .