具有角度分量的动态嵌套视图

时间:2016-06-22 08:13:44

标签: javascript angularjs angular-ui-router

我有一个带组件的angularjs应用程序,我想使用ui.router添加一个视图作为另一个视图的子视图。老实说,我不认为ui.router完全支持组件,这可能发生在升级版本1.0中。但同时我能做些什么才能动态地使用显示视图?

这是我的$ stateProvider(我完成了我的尝试)

 $stateProvider
  .state('home', {
    url :'/home',
    template :'<home></home>'
  })
  .state('projects', {
    url:'/projects',
    template:   "<project-list></project-list>"
  })
  .state('projectDetails',{
    url:'/:projectId',
    template : '<project-detail projectDetails="projectDetails"></project-detail>'
   , views :{
      'chat':{
          template : '<chat></chat>'

      }
    }
  });
  $urlRouterProvider.otherwise('home');

我以这种方式创建了一个组件:

   (function() {
  'use strict';
function ChatController($scope, $element, $attrs, $firebaseArray) {
  var ctrl = this;


  console.log("it works");

}
angular.module('myapp').component('chat', {
  templateUrl: '/app/component/project/chat.html',
  controller: ChatController
});
})(window.angular);

然后我在projectDetails中添加了视图

<div ui-view="chat"></div>

1 个答案:

答案 0 :(得分:0)

我对您的要求的理解是,您有一个名为&#39; Chat&#39;您想要加载状态&#39;项目详情&#39;作为嵌套/子视图。 正如你已经观察到ui-router不支持这一点。

但这可以通过制作您的项目细节来实现。作为父状态并加载作为子状态包含的其他组件。

Plunker Demo

angular.module('app', [
  'ui.router'
]).config(function($stateProvider, $urlRouterProvider) {
  $urlRouterProvider.otherwise('/');
  $stateProvider.state('home', {
    template: '<home></home>'
  }).state('home.parts', {
    url: '/',
    views: {
      'about-view@home': {
        template: "<about></about>"
      },
      'chat-view@home': {
        template: "<chat></chat>"
      }
    }
  });
}).component('app', {
  templateUrl: 'app.html'
}).component('home', {
  templateUrl: 'home.html',
  controller: homeController,
  controllerAs: 'vm'
}).component('about', {
  templateUrl: 'about.html',
  controller: aboutController,
  controllerAs: 'vm'
}).component('chat', {
  templateUrl: 'chat.html',
  controller: chatController,
  controllerAs: 'vm'
});

function chatController() {
  this.name = "chat";
}

function aboutController() {
  this.name = "about";
}

function homeController() {
  this.name = "home";
}

希望这是你想要的。请不要将url添加到父状态。考虑将其设置为抽象状态。