【问题标题】:Get controller reference from callback using typescript使用打字稿从回调中获取控制器引用
【发布时间】:2016-05-30 19:42:01
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,当我添加了 on-tile-clicked="DashboardCtrl.onTileClicked(tile)"
    • 但现在我无法访问 promise 中的 this:this.tiles = data;你能帮忙吗?
    • 如果你使用 lambda 风格的函数,这指的是你的 DashboardController 实例。你能确认你使用 lamdba 风格吗?如果是,您可以使用以下代码测试您的功能吗: public onTileClicked(tile:ITile) { var self = this; this.tileService.getTiles(tile.ID) // 无法访问 tileService .then((data)=> { self.tiles = data; // 无法访问 this.tiles }) }
    • 可以用但是太丑了,没有别的办法吗?
    • 哦,是的!我理解 :) 当您使用调试器(在 chrome、safari、IE、edge 中......)时,您会使用 JavaScript 调试器(即使您看到您的打字稿代码)。因此,lambda 函数的 typescript 中的“this”键与 JavaScript 的“this”不同。如果您在调试 typescript lamdba 函数时想要“this”关键字的值,则必须查看 JavaScript“_this”变量。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 2016-11-27
    • 1970-01-01
    • 2017-02-22
    • 2020-10-25
    相关资源
    最近更新 更多