4

我正在尝试将组件的方法deletePhotoeditPhoto方法公开businessPhotosverticalGrid组件中。但是有些是无法访问的。

任何帮助将不胜感激,谢谢

照片.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
      };
    }]
  });

照片.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>

垂直网格.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]);
      }
    }]
  });

垂直网格.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>
4

2 回答 2

0

您的组件是嵌套的。子组件可以调用父函数require

例子:

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

$onInit有必要告诉 Angular 等到组件加载完毕。

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

于 2016-06-28T14:29:24.813 回答
-2

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

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

于 2016-06-28T12:23:20.447 回答