【问题标题】:Send input value to a separate component on button press - AngularJS按下按钮时将输入值发送到单独的组件 - AngularJS
【发布时间】:2017-06-11 21:30:06
【问题描述】:

我有两个组件都链接到同一个模块:

angular.module('app', []);

第一个组件是一个简单的输入框和按钮

angular.module('app').component('myInput', {

    template: '<input data-ng-model="$ctrl.value"/>' +
              '<button data-ng-click="$ctrl.post()">Post</button>',

    controller: function MyInputController(){
        this.value = "";
        this.post = function(){
            // get this.value from input and send to other component
        };
    }

});

第二个组件只是一个基于控制器中数组的重复P标签

angular.module('app').component('myOutput', {

    template: '<p data-ng-repeat="item in $ctrl.data">{{ item.value }}</p>',

    controller: function MyOutputController(){
        this.data = [{value: "Example Data"}];
        /* 
           When this receives the data from the other component
           it will push() it into this.data
        */
    }
});

如何让&lt;my-input/&gt; 组件的$ctrl.post() 方法将数据发送到另一个&lt;my-output/&gt; 组件,以便它可以push() 将它放入它的data 数组并被@987654329 拾取@?

或者,是否可以将push() 直接放入其他组件的controller.data 数组中?

我的意思是,归根结底,它们都是普通的旧对象!

【问题讨论】:

    标签: angularjs components


    【解决方案1】:

    为了在不同范围之间传递数据,您可以:

    1) 将此数据存储在 angularjs service(provider) 中,并通过 DI 将其注入您的控制器中。在我看来,如果您的组件彼此远离,这是最好的方式。

    2) 使用scope propagation$scope.emit()$scope.broadcast())在不同范围之间发送和接收数据。但是,如果您的组件不在“祖先 后代”关系中,我认为这不是一个好主意。在您的情况下,您可以为两个控制器创建一个父控制器,您将从my-input 组件向其发送数据,通过$scope.on() 捕获它,然后发送到my-output。否则,您可以使用$rootScope 在组件之间进行通信。

    3) 在指令/组件的父子范围之间使用数据绑定(有关详细信息,请阅读this)。在您的情况下,考虑到您的组件不是父母和孩子,这也不是一个好主意。

    【讨论】:

    • 啊,我明白了,谢谢@GProst。看起来我正在以错误的方式解决这个问题。我想象这个过程类似于 ReactJS,在组件之间传递信息相对简单。将父/子传播与$broadcast$emit 一起使用而不是使用$rootscope 是首选做法吗?
    • 不知道这两种做法,但我更愿意避免这样的广播,尤其是长距离广播。因为以后很难调试和维护。您需要查找所有这些事件路径,这可能会令人困惑。所以我在父子之间使用服务和数据绑定(单向数据绑定更受欢迎)。
    猜你喜欢
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2014-06-26
    • 2018-02-11
    相关资源
    最近更新 更多