打字脚本+;JavaScript:x不是一个函数吗?
我是TypeScript新手,我在AngularJS+TypeScript/JavaScript应用程序中遇到了一个bug 我的服务有点像这样:打字脚本+;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:
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),