1

我有以下代码:

function submitHandler(dialog) {

    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: dialog.$form.serializeArray()
    })
        .done(onSubmitDone())
        .fail(onSubmitFail());
}

这个函数有一个对话框参数,它是一个看起来像这样的对象:

{
        $modal: $modal,
        $form: $modal.find('.form'),
        $message: $modal.find('.message'),
        $submits: $modal.find('.submit-button'),
        href: $form.attr('data-href')
    };

我需要将对话对象发送到 onSubmitDone 和 onSubmitFail 函数。以前我没有使用对象来保存 $modal、$form 等,并且这些变量都可用于包含在外部函数中的所有函数

两个问题:

将事物作为对象的一部分传递是明智的,还是应该在外部函数的顶部声明这些变量。

如果我确实传递了对象,我该如何将它传递给以下对象:

function onSubmitDone(json) {
    json = json || {};
    if (json.Success) {
        switch (action) {

我知道我的 json 对象已传递,但我怎样才能传递对话框对象呢?

4

4 回答 4

1

将对话框参数传递给 ajax 回调的一种方法是将其包含在回调定义中,如下所示:

function submitHandler(dialog) {
    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: dialog.$form.serializeArray(),
        success: function(data, textStatus, jqXHR) {
            onSubmitDone(data, textStatus, jqXHR, dialog);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            onSubmitFail(jqXHR, textStatus, errorThrown, dialog);
        }
    });
}

我明确了所有回调参数(data、textStatus、jqXHR、errorThrown),但如果您不想使用它们,则不需要全部使用。

于 2012-10-07T04:01:21.700 回答
0

Underscore js是一个用于对象处理和操作的独特且非常棒的库

既然你想传递你的对象是明智的在函数之外声明它然后你可以访问你的对象的部分并在你的函数体中使用它们。

您的代码将如下所示:

var jsonObj;    
function submitHandler(dialog) {
        jsonObj=dialog.$form.serializeArray();
        dialog.$submits.disableBt();
        dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
        $.ajax({
            url: href,
            dataType: 'json',
            type: 'POST',
            data:jsonObj 
        })
            .done(onSubmitDone(jsonObj))
            .fail(onSubmitFail(jsonObj));
    }
于 2012-10-07T03:59:21.433 回答
0

关于你的问题,如果你可以传递对象是否明智,你可能会发现这样做有点麻烦,需要在需要使用它时将变量拖到周围。我建议将您的对话框对象封装在您的 submitHandler() 函数的父范围内,以便它可用于 submitHandler、onSubmitDone 等。

关于第二个问题,如果您要传递它以及如何将对话对象也传递给 onSubmitDone 函数,您始终可以将响应和对话对象传递给 onSubmitDone 函数,如下所示:

.done(onSubmitDone(response, dialog))
于 2012-10-07T04:11:21.687 回答
0

如果您将对象作为 的context选项传递$.ajax,它将在this内部onSubmitDone和中可用onSubmitFail

var jsonObj; // do you really need this global?

function submitHandler(dialog) {
    jsonObj=dialog.$form.serializeArray();
    dialog.$submits.disableBt();
    dialog.$message.addMessage("loading", "<li>Contacting Server, please wait ...</li>");
    $.ajax({
        url: href,
        dataType: 'json',
        type: 'POST',
        data: jsonObj ,
        context: dialog
    })
        // Don't call the handlers from here, no ()!
        .done(onSubmitDone)
        .fail(onSubmitFail);
}

// Receives the data from the server
function onSubmitDone(response) {
    // your object is available as 'this':
    console.log(this.$modal);
}

// Different params here, but 'this' is the same
function onSubmitFail(jqXHR, textStatus) { /* ... */ }
于 2012-10-07T04:21:30.447 回答