使用ui路由器访问父作用域变量

时间:2016-03-16 08:51:40

标签: javascript angularjs angularjs-scope

我目前正在使用ui路由器,如下所示: -

$stateProvider
    .state('login', {
    url: '/login'
    , resolve: loadSequence(
        'base')
    , templateUrl: 'app/shared/main/login-main.html'
    , controller: 'mainController'
    , abstract: true
})
    .state('login.signin', {
    url: '/signin'
    , resolve: loadSequence(
        'login-items'
        , 'spin'
        , 'ladda'
        , 'angular-ladda'
        , '_loginController'
        )
    , templateUrl: "app/components/login/login_login.html"
    , controller: 'loginController'
});

现在在loginController中我希望能够访问mainController中的一个函数。

我目前的实施是否可行: -

angular.module('app').controller('mainController', function($scope, $state) {
  $scope.showWarning= function(){
      //show warning
  }
});

angular.module('app').controller('loginController', function($scope, $state) {
  // I want to access $scope.showWarninghere;
});

3 个答案:

答案 0 :(得分:1)

getData()方法解压缩到服务中,然后将其注入两个控制器:

angular.module('app').factory('dataService', function () {
    return {
        getData: function() { ... }
    }
});

angular.module('app').controller('mainController', function($scope, $state, dataService) {
  // You probably don't need to put this into your scope, but if you do:
  $scope.getData = dataService.getData.bind(dataService);
});

angular.module('app').controller('loginController', function($scope, $state, dataService) {
  dataService.getData(); 
});

记住在状态之间导航时创建和销毁范围和控制器是很有用的,因此任何实际上想要存在于多个状态的东西确实都希望存储在服务中。

答案 1 :(得分:1)

正如Duncan和Sanjay所说,使用服务获取数据可能确实更好,但我想我会回答原来的问题,所以你知道: < / p>

docs所述,要激活prototypal inheritance视图必须嵌套,而不仅仅是状态。

因此,为了使loginController能够访问mainController的范围,login-main.html模板必须使用uiView指令(例如<div ui-view></div>)将是login_login.html州的login.signin模板的占位符。

答案 2 :(得分:0)

您可以使用angular service

我找到了Plunker代码来解决您的问题