Angular:从孩子到父母的绑定功能

时间:2016-05-04 14:20:19

标签: javascript angularjs data-binding

通常我们给child-directive一个回调函数,如果发生了什么事情就可以调用它。就我而言,反之亦然;我想告诉指示一些事情。我仍然使用角度1.4(但很快我会移动到1.5并最终移动到2)。考虑到这一点,我想避免使用$watch$broadcast之类的内容。

所以,我认为有两种解决方案:1)使用服务和2)将一个回调函数从子节点绑定到父节点

1)虽然这可能是首选解决方案,但我发现有两个问题     a)完成这项简单任务的全部服务     b)您需要$watch来检测更改

2)嗯,这个解决方案听起来非常简单,但似乎比我预期的要复杂得多,或者甚至不可能:(

这是我的测试代码:

<button ng-click="mycontroller.callback()">Click me</button> 
<bar-foo activate-me="mycontroller.callback"></bar-foo>

因此,mycontroller没有函数callback,但指令bar-foo没有

angular.module('HelloApp')
    .directive('barFoo', function () {
        return {
            restrict: 'E',
            scope:{
                activateMe: '='
            },
            controller: function ($scope) {
                $scope.activateMe = function () {
                    this.activated = true
                }
            },
            template: '<p ng-if="activated">Activated</p>'
        }
    });

DEMO

我尝试的是什么?或者我应该接受services是解决这个问题的唯一方法还是更多?

2 个答案:

答案 0 :(得分:1)

我觉得你在这里想的太难了。虽然可以为外部控制器提供一个直接调用和通知指令的功能(你不应该这样做),但更直接和自然的方法是使用输入绑定。在您的情况下,它将如下所示:

&#13;
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>

<div ng-app="HelloApp" data-ng-controller="MyCtrl as mycontroller">
  <button ng-click="mycontroller.callBarFoo()">Click me</button>
  
  <bar-foo activate-me="mycontroller.callback"></bar-foo>
</div>
&#13;
{{1}}
&#13;
&#13;
&#13;

通常,控制器应该在适当的时候让指令知道数据。这是推荐的数据流方向:来自控制器 - &gt;成指令。指令永远不应该要求数据本身。它的控制器决定何时以及将什么传递给指令。当指令可能需要一些数据时 - 可以使用双向绑定。

相关阅读我把放在一起。

答案 1 :(得分:0)

我知道的另一种方法是将一些id附加到指令根元素。 然后从你的控制器你可以这样做。

angular.element(document.getElementById('the-id')).scope().directiveFunction(args);