将数据从子组件传递到父组件

时间:2016-06-13 05:37:00

标签: angularjs typescript angular-material

我正在使用一个app控制器来调用一个模型窗口,我想将数据从模型窗口传递到app控制器。我怎么能这样做?

//parent Controller
class appCtrl implements IappSettings {
    public displayItems = [some array items];
    public sortingItems = [some array items];
    public backItems: string;
}

dopopup(event) {
    this.$mdDialog.show({                
        controller: appCtrl,
        controllerAs: '$ctrl',
        template: '<displayArrayCtrl on-save="$ctrl.onSave(displayColumns)"></displayArrayCtrl>'
    });
}

onSave(displayColumns) { //on button click on child controller
  this.backItems = displayColumns; //Using {{$ctrl.keyItems}} in app.html page but it's giving me empty string
}

//Child Controller
class displayArrayCtrl {
    saveData = function (selectedFields: any, sortSelectedFields: any) { //on button click on parent controller
        this.onSave({displayColumns: this.displayColumns}); //calling parent controller event
    }       
}

class displayArrayOptionsOptions implements ng.IComponentOptions {
    public controller: any;
    public templateUrl: string;
    public bindings: any;

    constructor() {
        this.controller = displayArrayCtrl;
        this.templateUrl = 'page.html';
        this.bindings = {
            onSave: '&',
            displayItems: '<',
            sortingItems: '<'
        };
    }

angular.module('app')
  .component('displayArrayCtrl', new displayArrayOptionsOptions());

它将我的保存事件从子控制器调用到父控制器,但是分配变量无法正常工作。

2 个答案:

答案 0 :(得分:1)

tabposition窗口返回值的直接方法是使用它返回的承诺:

$mdDialog

有关更多信息,请参见

答案 1 :(得分:0)

我发现在Parent to ChildChild to Parent之间进行通信的方法很少,似乎是:

$broadcast:从父母传给孩子 $emit:从孩子转到父母。

如果您在使用不同的组件时拥有相同的控制器和不同的组件,并且控制器不会更新父级或子级范围,则上述将非常有用,结果您无法显示更新的值。

可以帮助的事情是使用我已经用于通信的控制器进行绑定。

解决方法:

弹出显示任何控制器可以使用的不同组件:

this.$mdDialog.show({
  scope: this.$scope,
  preserveScope: true,
  bindToController: true,
  template: '<somecomponentname get-back-items="$ctrl.getBackItems"></somecomponentname>'
});

而somecomponentname组件具有:

constructor() {
  this.controller = someItemCtrl;
  this.templateUrl = 'scripts/somefolder/someitem.html';
  this.bindings = {               
    getBackItems: '='
  };
}

我在getBackItems组件中创建的one more controller上定义了somecomponentname,如:

public getSelectedFields: any;
弹出窗口上的

关闭将值分配给getBackItems,它会立即反映到parent controller two way binding