【问题标题】:Calling function in child controller from parent controller从父控制器调用子控制器中的函数
【发布时间】:2017-10-01 13:21:48
【问题描述】:

我有一个嵌套在另一个控制器中的控制器。

<div ng-controller="manufacturerController" ng-cloak>
    <div ng-controller="contractController" ng-cloak>
        <div data-ng-if="item" class="panel panel-default">
            <div class="panel-heading text-center">
                <span class="h3">Contract</span>
            </div>
        </div>
    </div>
    <button data-ng-if="item && !ajaxOut" class="btn btn-success" data-ng-click="saveItem()">Save</button>
</div>

saveItem() 通过按钮调用,代码在manufacturerController中:

    $scope.saveItem = function () {
        $scope.ajaxOut = true;
        $scope.saveContracts();
    };

但是函数 saveContracts() 在 contractController 中。我想从manufacturerController.saveItem()调用contractController.saveContracts()。

根据这里我应该可以很好地调用父方法:How to call a function from another controller in angularjs?

但是保存会冻结浏览器。我做错了什么,我该如何解决?

【问题讨论】:

  • 你不直接这样做。您可以通过事件/通知来完成。控制器不应该相互了解。您可以使用内置的 $broadcast,也可以设置一个简单的观察者通知服务。
  • @TimConsolazio 你能举个例子吗?
  • 查找“$on $emit $broadcast angularjs”。那里有很多例子。

标签: angularjs angularjs-controller


【解决方案1】:

一种方法是在范围内广播事件:

function ParentController($scope) 
{
  $scope.$broadcast('someEvent', args);
}

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

作用域事件传播

作用域可以以与 DOM 事件类似的方式传播事件。该事件可以是broadcasted 到作用域子级或emitted 到作用域父级。

— AngularJS Developer Guide - Scope Event Propagation

欲了解更多信息,请参阅Can one controller call another?

【讨论】:

    【解决方案2】:

    您可以使用 $broadcast 从父级到子级:

    function ParentCntl($scope) {
    
        $scope.msg = "";
        $scope.get = function(){
            $scope.$broadcast ('someEvent');
            return  $scope.msg;        
        }
    }
    
    function ChildCntl($scope) {               
        $scope.$on('someEvent', function(e) {  
            $scope.$parent.msg = $scope.get();            
        });
    
        $scope.get = function(){
            return "xyz";    
        }
    }
    

    【讨论】:

      【解决方案3】:

      查找“$on $emit $broadcast angularjs”。那里有很多例子。

      (正如我之前在评论中所说,您不希望控制器彼此了解。一个发送事件/通知,另一个听到它,有点像你不认识的人只是站起来一个房间,喊一个你感兴趣的名字)。

      每个用于不同的上下文。根据您正在做的事情,您可能会使用其中一种。理解其中的每一个对于 AngularJS 开发人员(以及任何 UI 开发人员的整体概念)都非常重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多