【问题标题】:Call method of an controller in another controller angularjs另一个控制器angularjs中控制器的调用方法
【发布时间】:2015-09-02 10:17:31
【问题描述】:

我尝试在CustomerController中调用civilitiyController的一个方法。所以,通过我的搜索,我找到了事件的经理来调用方法,但我没有成功将结果从 CivilityController 返回到 CustomerController。

我已经试过了:

1/ 文明控制器:

$scope.$on("getListCivilities", function(event, args){
     $scope.civilities = getCivilitiesList();
});

customersController :

$scope.$broadcast("getListCivilities");
console.dir($scope.civilities) // after run civilities = undefined

2/CivilitiesController:

$scope.$on("getListCivilities" , function(event, args){
     var list = getCivilitiesList();
     return list;
});

客户控制器:

$scope.civilities = $scope.$broadcast("getListCivilities");
console.dir($scope.civilities); //display var of broadcast

3/ 编辑: 在第一次回答之后,我尝试了这个:

市政管理员:

 function getCivilitiesList()
    {
        var reqGetCivilities = $http({ url: 'api/Civilities/Get' });
        reqGetCivilities.success(function(data){
            $scope.civilities = data;
            $scope.$broadcast("getListCivilities", { list: $scope.civilities });
            return data;
        });
    }
    getCivilitiesList(); 

客户控制器:

function test()
    {
        $scope.$on("getListCivilities", function (event, args) {
            $scope.civilities = args.list;
            console.log('test0');
            console.dir($scope.civilities);
        });
    }

    test();

$scope.$on 从未被执行,我不明白为什么。

我希望有人可以帮助我。

【问题讨论】:

  • 将 $scope.$broadcast 更改为 $rootScope.$broadcast 并将 rootscpope 注入您的文明控制器
  • 我已经测试过了,还是不行。
  • 我不确定这是声明和使用控制器的正确方法
  • 我给出了我的控制器的两种方法。但这不是我的全部控制器。我将发布我的整个 CivilitiesController 但 customerController 它太长了,而且这个控制器的主要部分对我的问题没有意义。

标签: angularjs events methods controller broadcast


【解决方案1】:

检查这个plunker

app.controller('Controller1', function($scope) {
  $scope.name = 'World';
  $scope.$on('ValueUpdated', function(event, args) {
    $scope.name = args.currentValue;
  });
});

app.controller('Controller2', ['$rootScope', '$scope', function($rootScope, $scope) {
  $scope.myData = "type here";
  $scope.broadCast = function() {
    $rootScope.$broadcast('ValueUpdated', {
      currentValue: $scope.myData
    });
  }

我使用了广播,但您也可以使用服务和观察者来做到这一点。

【讨论】:

  • 当我看到你的例子时,我认为我犯了一个错误。如果我想将文明列表发送到 customerController,我不应该将 $broadcast 方法放在 CivilitiesController 中,将 $on 方法放在 CustomersController 中?
  • 是的,将控制器 2 视为您的文明控制器,将控制器 1 视为您的客户控制器。所以控制器 2 广播控制器 1 的行为
  • 我不知道你是否看到我的编辑。但我试着像你一样做,但我的 $on 没有被调用,我不知道解决它。
【解决方案2】:

我想下面应该可以工作:

function CivilitiesController($scope) 
{
  $scope.$on('someEvent', function(event, args) {});
  // another controller or even directive
}

function CustomersController($scope) 
{
  $scope.$emit('someEvent', args);
}

JSFiddle(更多详情):http://jsfiddle.net/nikdtu/moo89kaw/

【讨论】:

    【解决方案3】:

    Ahmet Zeytindalı,这是我的整个 CivilitiesController:

    (function () {
    'use strict';
    'use strict';
    
    angular
        .module('LSapp')
        .controller('CivilitiesCtrl', CivilitiesCtrl)
    
    CivilitiesCtrl.$inject = ['$scope', '$http', '$rootScope'];
    
    function CivilitiesCtrl($scope, $http, $rootScope) {
        function getCivilitiesList()
        {
            var reqGetCivilities = $http({ url: 'api/Civilities/Get' });
            reqGetCivilities.success(function(data){
                $scope.civilities = data;
            });
        }
        getCivilitiesList();
    
        function getList()
        {
            $rootScope.$broadcast("getListCivilities", { list: $scope.civilities });
        }
        getList();
    }
    

    })();

    以及获取列表的方法:

    (function () {
    'use strict';
    
    angular
        .module('LSapp')
        .controller('CustomersCtrl', CustomersCtrl)
    
    CustomersCtrl.$inject = ['$scope', '$http', '$location', '$modal', '$window', '$compile','$cookies', '$state','locker','$q','$timeout', '$rootScope'];
    
    function CustomersCtrl($scope, $http, $location, $modal, $window, $compile, $cookies, $state, locker, $q, $timeout) {
         //some code
     function test()
        {
            $scope.$on("getListCivilities", function (event, args) {
                $scope.civilities = args.list;
                console.log('$on args : ');
                console.dir(args);
            });
        }
        test();
    
    }
    

    });

    $on 方法没有运行,如果我把 console.log($scope.civilities) 放在方法后面,结果总是未定义。

    【讨论】:

    • 删除整个getlist函数并删除getList();也。然后将 $rootScope.$broadcast 移动到 reqGetCivilities.success(function(data){
    • 我已经测试过了,还是不行。为此,我创建了一个调用广播的方法。但我认为我的问题来自带有 $on 方法的 CustomerController 而不是来自civilityController。我不确定,因为我不知道如何测试广播的值,但是当我将 console.log() 放在广播方法中时,它会显示,而不是在我的 $on 方法中。
    • 我设法处理了控制器之间的通信。事实上,这确实是一个小错误,我忘了实例化我的 CivilityController。感谢您的帮助,这对更好地了解控制器之间的通信非常有用。
    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多