Прикрепить метод к контроллеру с помощью TypeScript и controllerAs

Я видел пару примеров использования TypeScript с контроллером angular и присоединения методов через область действия как этот.

Однако сейчас лучше использовать controllerAs.

Учитывая следующий TypeScript (при условии, что он был правильно зарегистрирован как контроллер в другом месте и т. д.):

class exampleCtrl {

    public publicArray = [1,2,3];

    public somePublicMethod() {
        window.console.log('ran function')
    }

}

Это производит:

var exampleCtrl = (function () {
    function exampleCtrl() {
        this.publicArray = [1, 2, 3];
    }
    exampleCtrl.prototype.somePublicMethod = function () {
        window.console.log('ran function');
    };
    return exampleCtrl;
}());

Обратите внимание, что somePublicMethod добавлено к прототипу, а publicArray добавлено непосредственно к this.

Насколько я могу судить, методы, добавленные в прототип, недоступны через DOM с помощью controllerAs.

e.g

<div ng-controller="exampleCtrl as vm">
    {{vm}} <!-- No function is output just {"publicArray":[1,2,3]} -->
    <div ng-click="vm.somePublicMethod">Click me</div> <!-- click event doesn't work -->
</div>

Как мне теперь получить доступ к somePublicMethod через DOM? Или, скорее, как я могу сделать публичную функцию в классе TypeScript (ES6) общедоступной при использовании синтаксиса controllerAs?

plunker, чтобы показать, что я вижу.


Другие пункты:

Я знаю, что public, private и protected на самом деле не меняют способ транспиляции кода, они просто предупреждают вас, если вы используете их неправильно.


person Matt Lishman    schedule 12.05.2016    source источник


Ответы (1)


It is

<div ng-click="vm.somePublicMethod()">Click me</div>

Насколько я могу судить, методы, добавленные в прототип, недоступны через DOM с помощью controllerAs.

Они есть. Так работают прототипы JS.

person Estus Flask    schedule 12.05.2016
comment
Ой, простая ошибка при создании отдельного примера. Я думал, что это так. Хотя стоит знать, что это возможно. Я предполагаю, что в моем приложении есть проблема в другом месте. Спасибо. - person Matt Lishman; 12.05.2016