打字稿:这不是指向班级

时间:2014-05-14 20:25:47

标签: angularjs typescript ionic-framework

我正在使用ionicframework和TypeScript。当我创建一个模态对象时,如下所示,模态对象是成功创建的,但在回调中它所说的内容。$ scope.modal = modal; 引用了浏览器窗口,因此$ scope未定义。我怎样才能这个指向班级?

export class MyCtrl {
    constructor(private $scope: any, private $ionicModal) {

        // Load the modal from the given template URL
        this.$ionicModal.fromTemplateUrl('MyApp/myModal.html', (modal) => {
            this.$scope.modal = modal;
        }, {
                // Use our scope for the scope of the modal to keep it simple
                scope: this.$scope,
                // The animation we want to use for the modal entrance
                animation: 'slide-in-up'
            });

2 个答案:

答案 0 :(得分:3)

在TypeScript中,lambda中的this在JavaScript中没有this的传统行为。如果你看一下编译好的JS,就会明白发生了什么,但基本上它通常会比你期望的更高 - 在你的情况下是窗口对象。

解决此问题的最简单方法是使用注释在行上方var self=this;,然后在lambda中引用self,或者只使用普通函数语法,例如{{1}它保留了JS的function(modal) {的传统功能。

Dan Quirk回答了我在这里提出的类似问题:https://typescript.codeplex.com/workitem/1655

您可能还希望看一下:Can I access the other this in a TypeScript lambda?

答案 1 :(得分:3)

如果您拨打new MyCtrl($myScope, $ionicModal)之类的内容,则对this的引用会正确指向MyCtrl的新实例。

我怀疑你是否将MyCtrl类传递到Angular期望函数而不是类的地方!

由于JavaScript的一个令人困惑的方面,你的代码实际上失败了,即构造函数可以(错误地)用作普通函数而不使用new,在这种情况下this将指向更高的值起来。

解决方案是使用普通函数而不是类,尝试:

function myCtrl($scope: any, $ionicModal) {

    // Load the modal from the given template URL
    $ionicModal.fromTemplateUrl('MyApp/myModal.html', (modal) => {
        $scope.modal = modal;
    }, {
            // Use our scope for the scope of the modal to keep it simple
            scope: $scope,
            // The animation we want to use for the modal entrance
            animation: 'slide-in-up'
        });