Javascript类模型:从对话框定义调用类函数

Javascript类模型:从对话框定义调用类函数,javascript,Javascript,我使用的是John Resig的类模型(),有一个问题: 在下面的类中,我正在构建一个删除对话框。当按下“是”按钮时,我想执行handleDeleteItem功能。我该怎么做?我不能使用“this.handleDeleteItem”,因为“this”指的是对话框 var bItem = Class.extend({ init: function (type) { this.id = type + "-" + getNewId(); }, registerD

我使用的是John Resig的类模型(),有一个问题:

在下面的类中,我正在构建一个删除对话框。当按下“是”按钮时,我想执行
handleDeleteItem
功能。我该怎么做?我不能使用“this.handleDeleteItem”,因为“this”指的是对话框

var bItem = Class.extend({
    init: function (type) {
        this.id = type + "-" + getNewId();
    },
    registerDelete: function () {
        var itemId = this.id;

        // Build Delete Dialog
        var deleteDialog = '<div id="' + itemId + '-delete-dialog" title="Delete Item?"><p><br/><span class="ui-icon ui-icon-alert" style="float: left; margin: 0 7px 20px 0;"></span>Are you sure you want to delete this item?</p></div>';

        // Append dialog
        $('#b-main').append(deleteDialog);

        // Confirmation dialog
        $('#' + itemId + '-delete-dialog').dialog({
            buttons : {
                "Yes" : this.handleDeleteItem(),
                "No" : function () {
                    $(this).dialog("close");
                }
            }
        });

        $("#dialog").dialog("open");
    },
    handleDeleteItem: function () {}
});
var bItem=Class.extend({
init:函数(类型){
this.id=type+“-”+getNewId();
},
registerDelete:函数(){
var itemId=this.id;
//生成删除对话框
var deleteDialog='
是否确实要删除此项目?

; //附加对话框 $('#b-main').append(deleteDialog); //确认对话框 $(“#”+itemId+'-delete dialog')。对话框({ 按钮:{ “是”:this.handleDeleteItem(), “否”:函数(){ $(此).dialog(“关闭”); } } }); $(“对话框”)。对话框(“打开”); }, handleDeleteItem:函数(){} });
你做错了。请尝试以下操作:

$('#' + itemId + '-delete-dialog').dialog({
    buttons : {
        "Yes" : this.handleDeleteItem.bind(this),
        "No" : function () {
            $(this).dialog("close");
        }
    }
});
请注意,我将
this.handledeletitem()
替换为
this.handledeletitem.bind(this)

  • 当您执行
    this.handleDeleteItem()
    时,您正在调用
    this.handleDeleteItem
    ,并将其返回值指定为“Yes”的事件侦听器
  • 执行
    this.handleDeleteItem.bind(this)
    时,您将
    this.handleDeleteItem
    本身指定为“是”的事件侦听器。
    .bind(this)
    用于确保事件侦听器具有正确的
    this
    指针

  • 那么,如果
    this.handledeletietem
    未解析,那么
    bItem.handledeletietem
    可以吗?无论哪种方式,
    .handleDeleteItem()
    都返回未定义,这意味着您实际上将“Yes”绑定为nothing。感谢您的回复。但问题是我不能调用this.handleDeleteItem.bind(this),因为第一个“this”指向对话框,因此找不到函数定义。@user998066为什么
    this
    指向对话框?它在
    registerDelete
    的范围内进行评估。因此,
    将指向实例,而不是对话框。在我看来,this.handledeletietem.bind(this)应该可以正常工作。试试看。我意识到我在一个click()函数定义中调用了'this.handleDeteItem:$('#'+itemId.click(function(){…});我最终为对象定义了一个变量来保存对它的引用,然后调用该变量的函数,例如var myItem=this;之后:myItem.handleDeleteItem();