ui-router:没有视图模板的路由

时间:2013-10-04 01:20:12

标签: angularjs angular-ui-router

是否可以在ui-router中设置只有控制器的路线?目的是在某个URL上,我唯一想做的就是以编程方式执行操作,而不是根据视图显示任何内容。我已经阅读了文档,但我不确定他们是否提供了这样做的方法。

是的,我读过这个:https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-open-a-dialogmodal-at-a-certain-state,但这不是我想要的。

例如,我只想说我有一个带有视图的基本体:

<body ui-view></body>

一些基本的配置:

// Routes
$stateProvider
  .state('myaction', {
    url: "/go/myaction",
    onEnter: function() {
      console.log('doing something');
    }
  });

访问/go/myaction时,视图为空。有可能这样做吗?

5 个答案:

答案 0 :(得分:9)

我能够通过将我正在进行编程操作的无头状态重定向到一个无头状态结束时的状态来解决这个问题:

$stateProvider
  .state('myaction', {
    url: "/go/myaction",
    onEnter: function() {
      console.log('doing something');
    }
    controller: function($state) {
      $state.go('home');
    }
  });

答案 1 :(得分:9)

您不能拥有没有视图的控制器,但您可以使用app.controller('mainCrl', ['$scope', '$resource', '$location', 'AddEmployee', function ($scope, $resource, $location, AddEmployee) { $scope.nextPage = function(){ $scope.email = AddEmployee.email($scope.employeeEmail); }; $scope.createMeetup = function(){ $scope.first_name = AddEmployee.personal($scope.first_name); }; }]); 而不是控制器。如果您在访问此状态时不想更改当前视图,则可以将其定义为子状态:

onEnter

现在在$stateProvider // the parent state with a template .state('home', { url: '/home', templateUrl: '/home.html', controller: 'HomeCtrl' }) // child of the 'home' state with no view .state('home.action', { url: '/action', onEnter: function() { alert('Hi'); }, }); 你可以这样做:

home.html

答案 2 :(得分:1)

来自文档:

  

警告:如果未定义模板,则不会实例化控制器。

为什么不使用空字符串作为模板来克服这个问题?

答案 3 :(得分:1)

是的,你可以这样做。使用absolute view names重新使用其他州的<ui-view>

看一下这个例子:

用户转到我的应用,但根据他们的身份验证与否,我想将它们发送到公共或私人页面。我纯粹使用index状态来查看他们是否已登录,然后将其重定向到index.privateindex.public

子状态使用absolute view names来使用与<ui-view>状态对应的index元素。这样,我就不需要再制作第二个嵌套<ui-view>

$stateProvider.state('index', {
  url: "/",
  controller: 'IndexCtrl'
}).state('index.private', {
  views: {
    "@": {
      templateUrl: 'private.html',
      controller: 'PrivateCtrl'
    }
  }
}).state('index.public', {
  views: {
    "@": {
      templateUrl: 'public.html',
      controller: 'PublicCtrl'
    }
  }
});

关于此示例的一个小注释:我在这里使用@快捷方式。通常你会使用viewname@statename

答案 4 :(得分:0)

我的解决办法就是包含一个空白的模板(html文件)。