Angular JS 1.5 - 我想在角度js组件之间进行通信

时间:2016-06-28 12:21:04

标签: javascript angularjs angularjs-1.5 angular-component-router

我正在尝试将deletePhoto组件的editPhotobusinessPhotos方法公开到verticalGrid组件中。但有些如何无法访问。

感谢任何帮助,谢谢

photo.js

angular.module('business')
  .component('businessPhotos', {
    templateUrl: 'business/photos.html',
    controller: [ function() {
      var $ctrl = this;
      $ctrl.editPhoto = function(photo) {
       // code
      };

      $ctrl.deletePhoto = function(id) {
       // code
      };
    }]
  });

photo.html

<vertical-grid ng-if="$ctrl.business.provider_photos" cells="$ctrl.business.provider_photos" delete-photo="$ctrl.deletePhoto(id)" edit-photo="$ctrl.editPhoto(photo)"></vertical-grid>

垂直grid.js

angular.module('dashboard')
  .component('verticalGrid', {
    bindings: {
      cells: '<',
      deletePhoto: '&',
      editPhoto: '&'
    },
    templateUrl: 'utils/vertical-grid.html',
    selector: 'vertical-grid',
    controller: ['$element', function($element) {

      var $ctrl = this;

      $ctrl.colGrid = [];
      var numOfCols = 4;
      var numOfCells = $ctrl.cells.length;

      $ctrl.colCssClass = 'col-xs-3';


      for (var i = 0; i < numOfCells; i++) {
        var colIndex = i % numOfCols;
        if (!$ctrl.colGrid[colIndex]) {
          $ctrl.colGrid[colIndex] = [];
        }
        $ctrl.colGrid[colIndex].push($ctrl.cells[i]);
      }
    }]
  });

垂直grid.html

<div class="provider-photos row">
  <div class="{{$ctrl.colCssClass}}" ng-repeat="col in $ctrl.colGrid track by $index">
    <div class="photo-outer-tile" ng-repeat="cell in col track by $index">
      <div class="photo-tile">
        <img ng-src="{{cell.tile_url}}">
        <div class="photo-controls">
          <a ng-click="$ctrl.deletePhoto(cell.id)" href="javascript:void(0);">Delete</a>
          <a  href="javascript:void(0);">Crop</a>
        </div>
      </div>
    </div>
  </div>
</div>

2 个答案:

答案 0 :(得分:0)

您的组件是嵌套的。子组件可以使用require

调用父级函数

示例:

  .component('verticalGrid', {
    require: {
      parent: '^^businessPhotos'
    },
    controller: function () {
      this.$onInit = function () {
        this.parent.editPhoto();
      };
    },

$ onInit 是必要的,告诉tell angular等到组件加载。

^^ businessPhotos 将引用本地父组件。单个^也是可能的。

答案 1 :(得分:-2)

要在angularjs控制器之间进行通信,您可以使用service(或factory,这在概念上非常相似。) 例如,请参阅here 您可以使用$watch概念将事件从服务实时传播到控制器。

更简单的方法是在两个控制器中使用注入$rootScope