使用typescript从回调中获取控制器引用

时间:2016-02-18 14:58:15

标签: javascript angularjs angularjs-directive typescript angularjs-components

我有以下简单的控制器,它使用指令/组件并将函数作为绑定传递。

当被调用的函数我没有引用使用任何控制器类服务时。

在这种情况下,在我的控制器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;
            });
        };

1 个答案:

答案 0 :(得分:2)

你对该函数的绑定(在html中)是错误的。你错过了括号:

<tile-component ng-repeat="tile in DashboardCtrl.tiles" tile="tile"
                on-tile-clicked="DashboardCtrl.onTileClicked()"> <!-- HERE -->
</tile-component>