UI路由器多视图单控制器

时间:2015-04-17 19:53:38

标签: angularjs angular-ui-router

是否可以使用单一控制器拥有多个视图[https://github.com/angular-ui/ui-router/issues/494]

用例:我有一个ui-view = header和ui-view = content。我根据当前状态更改标题以显示上下文相关按钮(即返回,保存,过滤等)我希望这些按钮在内容控制器中调用函数,但如果我执行以下操作,则会创建两个MyController对象。如果有任何初始化函数,它们会被调用两次,这在大多数情况下是对我服务器的查询的两倍。

views:{
  'header':{
    templateURL:'...',
    controller:'MyController'
  },
  'content':{
    templateURL:'...',
    controller:'MyController'
  }
}

更新:基于@pankajparkar

我当前的index.html看起来像这样(为了理解而简化)

<nav ui-view="header"></nav>
<div ui-view="content"></div>

但您的建议包括/ REQUIRE子视图

<!--index.html-->
<body ui-view></body>

<!--format.html-->
<nav ui-view="header"></nav>
<div ui-view="content"></div>

使用以下控制器

state('app', {
  url: '/app',
  controller: 'MyController',
  templateURL: 'format.html', //Targets ui-view in index.html
  views:{
    'header':{
      templateURL:'...', //Targets ui-view="header" in format.html
    },
    'content':{
      templateURL:'...', //Targets ui-view="header" in content.html
    }
  }
});

3 个答案:

答案 0 :(得分:2)

你基本上需要在某种类型的提供者(通常是服务或工厂)处理这些东西,这些是单例,然后你可以将单例注入控制器,控制器的每个实例都将使用共享/同样的提供者。

如果您需要帮助,请分享您的控制器。

虽然我同意此处发布的其他答案中的建议,但您可能需要考虑将功能放在提供程序中。在大多数情况下,您最好将大部分功能和数据存储在提供程序中,让控制器只负责传递用户交互以触发提供程序中的相应调用(并且它将解决您当前的问题,因为它们是单身)。

答案 1 :(得分:1)

我以这种方式工作:

{{1}}

答案 2 :(得分:0)

您应该将该控制器放在views选项之外,以便它只在页面上加载一次

$stateProvider.state("abc",{
   url:'/abc',
   templateUrl: 'abc.html',
   controller:'MyController', //<---place it here will load it once
    views:{
    'header':{
        templateURL:'...'
    },
    'content':{
       templateURL:'...'
     }
   }

})