$仅发送到直接父控制器

时间:2016-02-09 22:47:49

标签: angularjs

有没有办法将$发射到直接父控制器?

我有不同的控制器,每个控制器使用一个看起来像这样的子分页指令。

.directive('pagination', function () {
return {
    restrict: 'E',
    templateUrl: '/Views/Shared/_Pagination.html',
    scope: { pagination: "=pagination" },
    controller: ['$scope', function ($scope) {
        $scope.$watch('pagination.Page', function (newVal, oldVal) {
            $scope.$emit('pageChanged', { page: newVal });
        });
    }]
}

当您更改控制器的页面时,分页指令将发送父控制器捕获的消息,并且父控制器httpGet将获取另一个页面。

问题是:如果我有控制器A,它包含子控制器B,它们都使用分页。当控制器B上的页面发生变化时,控制器B和A都将捕获该消息,因为A是B的父节点。所以,有没有办法只向最直接的父B发送消息,因为我改变了一个页面在控制器B上。

或者,如果我正在设计这个错误..请给出一些输入。谢谢!

1 个答案:

答案 0 :(得分:3)

回答你的问题

在您的父控制器内,您可以使用

VEG MSMC1 MSMC24 MSMC2 MSMC10
Onion 1 2 3 2
Radish 3 0 9 3

这将允许当前侦听器节点处理事件,但任何后续侦听器都不会接收它以进行处理。

  

stopPropagation - {function =}:调用stopPropagation函数将取消进一步的事件传播(仅适用于$ emit-ed的事件)。

更好的方法

由于你基本上使用的是一个回调范例,在这个范例中给定一个特定的事件,一个指令会调用一个传递给它的函数,然后你可以在你的指令范围内使用一个回调表达式。

event.stopPropagation()

声明您的指令

{
    scope: { pageChanged: '&' },
    link: function( $scope, elem, attrs ){
         //somewhere you trigger your pageChanged logic then fire this
         $scope.pageChanged({ $page: newVal })
    }
}

这比使用<div pagination page-changed="parentControllerFunc($page)"> 更多是 angular-ish ,因为你基本上是在尝试沟通。指令和指令所在的某个视图控制器。使用角度$emit API更多的是尝试通过事件总线进行通信,其中成员可能知道或不能更直接地相互通信。