打字脚本+;JavaScript:x不是一个函数吗?

打字脚本+;JavaScript:x不是一个函数吗?,javascript,angularjs,typescript,Javascript,Angularjs,Typescript,我是TypeScript新手,我在AngularJS+TypeScript/JavaScript应用程序中遇到了一个bug 我的服务有点像这样: module myApp { 'use strict'; export interface IActionItem { name: String; link?: String; icon: String; action?: any; className:

我是TypeScript新手,我在AngularJS+TypeScript/JavaScript应用程序中遇到了一个bug

我的服务有点像这样:

module myApp {

    'use strict';

    export interface IActionItem {
        name: String;
        link?: String;
        icon: String;
        action?: any;
        className: String;
        order: Number;
    }

    export interface IActionItemsService {
        getActionItems() : IActionItem[];
    }

    class ActionItemsService implements IActionItemsService {

        private activeActionItemClass:String = 'active_menu_item';
        private actionItems:IActionItem[] = [
            {
                name: 'Search',
                icon: 'magnifier',
                action: this.search,
                className: 'visible',
                order: 2
            }
        ];

        constructor() {

        }

        private search(actionItem:IActionItem) {

            this.toggleActiveClass(actionItem);

        }

        private toggleActiveClass(actionItem:IActionItem) {
            // do some stuff with the actionItem className
        }

    }
}
…处理将操作项数组设置为作用域的控制器。 只需一个简单的HTML页面即可处理单击操作:

<div class="list_menu_options" ng-repeat="actionItem in vm.actionItems | orderBy:'order':true ">

    <a ng-class="actionItem.className"
            ng-click="actionItem.action(actionItem)">
        <span class="icon-{{actionItem.icon}}"></span>
        {{ actionItem.name }}
    </a>

</div>

我肯定我在某个地方误用了一些东西,因为我对TypeScript的理解很少,但我似乎找不到它。有什么建议吗?

如果您将
toggleActiveClass
搜索
重写为lambdas会发生什么?根据这些方法的调用方式,
可能指向错误的对象。使用lambda将强制
这个
在词汇范围内-这意味着它将始终指向类,而不是依赖于函数的实际调用方式

    private search = (actionItem:IActionItem) => {
        this.toggleActiveClass(actionItem);
    }

    private toggleActiveClass = (actionItem:IActionItem) => {
        // do some stuff with the actionItem className
    }

原因是作为对象(文字)一部分的
action
函数不是实现对其
action
属性
search
的引用的实际类的实例@

      private actionItems:IActionItem[] = [{
            name: 'Search',
            icon: 'magnifier',
            action: this.search, //<-- this one
            className: 'visible',
            order: 2
        }
    ];
或者也可以用于词汇上下文解析,即

   action: (itm:IActionItem)=> this.search(itm:IActionItem),

嗯,错误消失了。但是,
ng单击
似乎不再调用
搜索
。我的控制台在“搜索”功能中记录“搜索”。它按照我上面的示例所期望的那样记录,但在使用
toggleActiveClass
search
作为lambdas时不会记录。这里,
action
actionItem
对象的一个属性-在我的示例中,我只有一个
actionItem
,它的
action
引用了
actionItemService
类中的
search
函数。是的。。我在发布评论并将其删除后注意到了它:)完美的工作得很有魅力。非常感谢。
   {
        name: 'Search',
        icon: 'magnifier',
        action: this.search.bind(this), //<-- this one
        className: 'visible',
        order: 2
    }
   action: (itm:IActionItem)=> this.search(itm:IActionItem),