AngularJS父指令与child指令通信

时间:2015-02-12 13:05:02

标签: javascript angularjs

考虑两个带隔离范围的嵌套指令:

<dctv1>
    <dctv2></dctv2>
<dctv1>

如果我希望dctv2dctv1交谈,我可以选择:

  1. 我可能需要使用dctv1
  2. dctv2定义中require:'^dctv1'的控制器
  3. 我可以使用包装器<dctv2 callParent="hello()"></dctv2>scope:{callParent:'&'}
  4. 在父作用域上调用表达式
  5. 我也可以在$scope.$emit中使用dctv2,但之后所有的父作用域都会听到此消息。
  6. 现在我希望dctv1dctv2交谈。

    1. 我可以做到这一点的唯一方法是使用$scope.$broadcast,但所有孩子都会听到。
    2. 通过谈到这里,我的意思是称为函数或类似函数。不想设置堵塞digestloop的手表。

      如何让dctv1以最佳方式通知dctv2,让它们松散耦合?我应该能够毫无错误地删除dctv2。

4 个答案:

答案 0 :(得分:3)

看看AngularJS NgModelController的一些想法。

每个<dctv2>指令都需要<dvtv1>才能注入控制器。然后,您可以将对象或回调添加到该控制器的属性,并在销毁<dctv2>时将其删除。

<dvtv1>不会直接与孩子交谈,但会触发与其属性绑定的回调。

例如;

NgModelController$parsers$formatters,它们是函数回调数组。您将自己的函数推送到数组中以扩展控制器的行为。

NgModelController执行输入验证时,它基本上通过这些属性与其他指令对话。

答案 1 :(得分:0)

我建议使用angular services。这样,您就可以将行为分离为一个或多个服务。

另请看一下:AngularJS : How to watch service variables?

答案 2 :(得分:0)

一种方法是建立一个与您想要的控制器通信的服务/工厂。

例如,这是一个getter / setter Factory

.factory('factoryName', function () {

    var something = "Hello";

    return {

        get: function () {
            return something;
        },

        set: function (keyword) {
            something = keyword;
            return something ;
        }
    };

}])

然后在你的控制器中:

.controller('controllerOne', ['factoryName', function (factoryName) {
    $scope.test = factoryName.get();
}]);

.controller('controllerTwo', ['factoryName', function (factoryName) {
    $scope.test = factoryName.get();
    $scope.clickThis = function (keyword) {
        factoryName.set(keyword);
    };
}]);

我建议您阅读:Can one controller call another?

答案 3 :(得分:-1)

您可以使用每个必须传递给父级的子级的ID来管理它;父母将使用该id广播事件:只有从父母传递的id是他自己的id时,孩子才会执行操作。

再见