ディレクティブ/コンポーネントを使用し、バインディングとして関数を渡す次の単純なコントローラーがあります。
関数が呼び出されているとき、コントローラークラスのサービスを使用するための参照がありません。
この場合、コントローラーpublic onTileClicked
関数では tileService にアクセスできません
コントローラーjs:
namespace app.dashboard {
'use strict';
export class DashboardController {
static $inject:Array<string> = ['$q', 'logger', 'tileService'];
constructor(private $q:ng.IQService,
private tileService:TileService) {
}
public tiles:Array<ITile> = [];
public onTileClicked(tile:ITile) {
this.tileService.getTiles(tile.ID) // No access to tileService
.then((data)=> {
this.tiles = data; // Won't have access to this.tiles
})
}
}
angular
.module('app.dashboard')
.controller('DashboardController', DashboardController);
}
コントローラのhtml:
<div class="tiles-container">
<tile-component ng-repeat="tile in DashboardCtrl.tiles" tile="tile"
on-tile-clicked="DashboardCtrl.onTileClicked">
</tile-component>
</div>
ディレクティブ js:
class TileComponent {
tile:ITile;
onTileClicked:Function;
/* @ngInject */
constructor() {
}
tileClicked() {
this.onTileClicked()(this.tile);
}
}
angular.module('app.dashboard')
.component('tileComponent', {
templateUrl: 'app/dashboard/directives/tile.html',
controller: TileComponent,
controllerAs: 'tileCtrl',
bindings: {
tile: '<',
onTileClicked: "&"
}
});
onTileClicked js:
DashboardController.prototype.onTileClicked = function (tile) {
var _this = this;
this.tileService.getTiles(tile.ID)
.then(function (tiles) {
_this.tiles = tiles;
});
};