0

我有一个以前没有的案例,真的无法弄清楚,这是什么问题。:( 我试图为我的旧的、不稳定的 js 代码创建一个控制器类,试图让它更加面向对象(是的,对我来说失败了,但实践也是知识之母)。所以,这是我的代码:

一个函数调用 Main 函数,该函数处理变量并弹出一个表单,例如:

function Main(com,  multiple, grid) {
    if (CheckTableFunctions(arguments) == true)
    {
        var partner = Partner.Factory(com);
        switch(com)
        {
            case "CreatePartners":
            ...
            break;

            case "GetPartners":
            $e = ShowModal(); // <- this makes a form visible
            Communicate(com, partner, function(data) <- ajax req. with callback
                {
                ... // <- manipulate data, fill form, etc.
                });
            Main("EditPartners", multiple, grid); // <- calling Main Editpartners case
            break;

事实上,GetPartners 案例在 EditPartners 之前,只是为了填表而已。编辑和事件绑定转到editpartners,如下所示:

            case "EditPartners":
            $e = GetModal(); // <- THE ERROR
            $e.find("a.submit").click(function(e){
                partner.fx_data.partner.data = getFormData($e)
                Communicate(com, partner, function(data) // <- return the modified values by ajax
                {
                    CloseModal();
                });
            });
        break;

因此,当我运行 fn GetModal 时,它返回一个空对象,但该函数在运行GetModal = fn(){$e=$(".poppedModal");return $e;}后正常工作Main(EditP)。我认为这是比其他任何事情都更合乎逻辑或有条理的错误。说实话,我用回调调用它,这意味着我使用ShowModal(callback)并且当它准备好时,我调用Main(EditP)了,但也没有工作。

编辑:

抱歉,我忘记了主要问题(我认为是主要问题)。所以我没有确切的表格,我只有一个 html 原型。原型,因为我总是在需要时克隆它。

所以这是showmodal fn,我认为这使得模态无法访问:

function ShowModal()
{
    $container = $('#myModal');
    $clone = $container.clone();
    $clone.removeAttr("id").addClass("clonedModal");
    $clone.modal('show');
    return $clone;
}

function ShowModal()
{
    $container = $('#partnerModal');
    document.getElementById('partnerForm').reset();
    $container.modal('show');
    return $container;
}

谢谢你的帮助。

重复

4

1 回答 1

1

几点:

  1. javascript 函数中的成员仅在使用var. 否则,它们是直到并包括全局名称空间的“外部”成员。您的几个变量需要本地化。未声明的变量可能会导致讨厌的错误。
  2. .clone()确实会创建一个 DOM 片段的克隆,但不会自动将其惰性化回 DOM。您需要使用 jQuery 指令来执行此操作,例如.append(), .prepend(), .before(), .after()。我强烈怀疑您的问题的很大一部分是试图.modal()在未插入的克隆上进行。
  3. 不清楚为什么每次使用时都需要克隆表单。这种编程很可能导致内存泄漏。重用一个表单会更干净、更正常。重置表单以清除以前输入/选择的值并不难。

编辑:

ShowModal 具有正确本地化的变量:

function ShowModal() {
    var $container = $('#partnerModal');
    document.getElementById('partnerForm').reset();
    $container.modal('show');
    return $container;
}

事实上,如果.modal()写成可链接的,应该是这样,那么ShowModal()可以简化以避免创建任何命名成员,本地或其他:

function ShowModal() {
    $('#partnerForm').get(0).reset();
    return $('#partnerModal').modal('show');
}

另外,请注意,按照 javascript 编程的惯例,只有构造函数才应该使用首字母大写来命名。构造函数是那些设计用来调用的new Fn()。(这里并不重要,但是关于构造函数的主题已经进行了很多讨论,有些人选择编写他们的代码以避免使用new)。

于 2012-05-22T00:05:21.127 回答