首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript和Knockout绑定到这个问题- lambda函数需要吗?

TypeScript和Knockout绑定到这个问题- lambda函数需要吗?
EN

Stack Overflow用户
提问于 2012-11-07 20:20:34
回答 8查看 9.9K关注 0票数 34

我一直在创建一个htmlHelper函数,使用TypeScript和KnockoutJS编辑电子邮件列表。

电子邮件列表是一个名为“ObservableArray ”的淘汰赛( Knockout ),我有一个针对每一项的链接来删除它们。这是HTML片段:

代码语言:javascript
复制
<ul data-bind="foreach: emails" >
    <li>
        <a href="#" data-bind="click: $parent.deleteItem">Delete</a>
        &nbsp;<span data-bind="text: $data"></span>
    </li>
</ul>

delete链接绑定到$parent.deleteItem,这是视图模型中的一个方法:

代码语言:javascript
复制
// remove item
public deleteItem(emailToDelete: string) {
    // remove item from list
    this.emails.remove(emailToDelete);
}

在执行deleteItem方法之前,所有这些都可以工作。此方法中的" this“在调用时是数组中的项,而不是视图模型。因此,this.emails是一个空引用,并且失败。

我知道TypeScript支持Lambda语法,但是我找不到正确的方法来编写这个语法(很少有例子)。

还是我可以采取不同的方法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-11-08 08:45:22

通过在类构造函数中声明方法主体,可以获得“this”的正确闭包。

代码语言:javascript
复制
class VM {
    public deleteItem: (emailToDelete: string) => void;

    constructor() {
        this.deleteItem = (emailToDelete: string) => {
            // 'this' will be pointing to 'this' from constructor
            // no matter from where this method will be called
            this.emails.remove(emailToDelete);
        }
    }        
}

更新:

似乎由于类型记录ver0.9.1,通过使用lambda字段初始化器,您可以获得相同的结果:

代码语言:javascript
复制
class VM {
    public deleteItem = (emailToDelete: string) => {
        this.emails.remove(emailToDelete);
    }        
}
票数 49
EN

Stack Overflow用户

发布于 2013-05-23 15:57:31

戴手套的人!只需将$parent绑定如下:

代码语言:javascript
复制
<a href="#" data-bind="click: $parent.deleteItem.bind($parent)">Delete</a>
票数 25
EN

Stack Overflow用户

发布于 2012-11-08 08:44:57

代码语言:javascript
复制
declare class Email { }
declare class ObservableArray {
    remove(any): void;
}

class MyViewModel {
    public emails : ObservableArray;

    constructor() {
        Rebind(this);
    }

    public deleteItem(emailToDelete: Email) {
        this.emails.remove(emailToDelete);
    }
}

function Rebind(obj : any)
{
    var prototype = <Object>obj.constructor.prototype;
    for (var name in prototype) {
        if (!obj.hasOwnProperty(name)
                && typeof prototype[name] === "function") {
            var method = <Function>prototype[name];
            obj[name] = method.bind(obj);
        }
    }
}

您可能需要一个用于Function.bind()的多填充

代码语言:javascript
复制
// Polyfill for Function.bind(). Slightly modified version of
// https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Compatibility
if (typeof Function.prototype.bind !== "function") {
    Function.prototype.bind = function(oThis) {
        if (typeof this !== "function") {
            // closest thing possible to the ECMAScript 5 internal IsCallable function
            throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
        }

        var aArgs = <any[]> Array.prototype.slice.call(arguments, 1),
            fToBind = this,
            fNOP = function() {},
            fBound = function() {
                return fToBind.apply(this instanceof fNOP && oThis ? this: oThis, aArgs.concat());
            };

        fNOP.prototype = this.prototype;
        fBound.prototype = new fNOP();

        return fBound;
    };
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13277537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档