【问题标题】:Binding an array of objects to their specific form fields for updating/deleting将对象数组绑定到其特定的表单字段以进行更新/删除
【发布时间】:2016-05-07 18:34:50
【问题描述】:

我需要将表单数据作为链接存储到对象数组中。然后可以单击链接并在表单中填写要更新或删除的对象/数据。

我能够将表单数据作为对象存储在数组中,但不知道如何将其加载回表单以进行更新。

var actors = [];

var addActor = function() {

// Assigning Form values to variables
var firstN = $("#fName").val();
var lastN = $("#lName").val();
var gender = $("[name='gender']:checked").val();
var birthdate = $("#birthDate").val();
var action = $("#action").prop('checked');
var comedy = $("#comedy").prop('checked');
var drama = $("#drama").prop('checked');
var sciencefiction = $("#sciencefiction").prop('checked');
var horror =$("#horror").prop('checked');
var suspense = $("#suspense").prop('checked');

// creates newActor variable that contains an object for each input value
var newActor = {fName: firstN, lName: lastN, gender: gender, birthDate: birthdate, action: action, comedy: comedy, drama: drama, suspense: suspense, sciencefiction: sciencefiction, horror: horror}

$("#actorsTable").append("<tr><td><a href='' class='update'>" + newActor.fName + " " + newActor.lName + "</a></td></tr> ");

actors.push(newActor);

console.log(actors);

};

现在我的选择器函数抓取了对象,但我只是不知道如何将它加载到表单中以进行更新和删除。我已经坚持了几天了。

var selectActor = function(e) {
    e.preventDefault();
    var rowClicked = $(this).parent().parent();
    row = rowClicked.index();
    alert (actors[row].fName + " " + actors[row].lName + " " +    actors[row].gender + " " + actors[row].birthDate + " " + actors[row].action + " " + actors[row].comedy + " " + actors[row].drama + " " + actors[row].suspense + " " + actors[row].sciencefiction + " " + actors[row].horror);
    console.log(actors[row]);
};

这是我目前所采取的行动。当我检查控制台时,存储和选择一切都是正确的,但我找不到任何显示如何将对象存储到其受尊重的表单字段中的内容。

Codepen

【问题讨论】:

    标签: javascript jquery arrays object


    【解决方案1】:

    考虑为您的代码使用命名空间,然后创建一些用于对象操作的通用函数(如数组)以及一些特定于您的表单的函数。 请注意,一些库(如 angular、react 等)会为您处理其中的一些,但您要求提供手动部分,并且可能也值得研究一种方法。

    这是一个更新的示例:http://codepen.io/MarkSchultheiss/pen/LNqdxK?editors=0010

    var myApp = myApp || {};
    myApp.arrayObj = {
      indexOf: function(myArray, searchTerm, property) {
        for (var i = 0; i < myArray.length; i++) {
          if (myArray[i][property] === searchTerm) return i;
        }
        return -1;
      },
      indexAllOf: function(myArray, searchTerm, property) {
        var ai = [];
        for (var i = 0; i < myArray.length; i++) {
          if (myArray[i][property] === searchTerm) ai.push(i);
        }
        return ai;
      },
      lookup: function(myArray, searchTerm, property, firstOnly) {
        var found = [];
        var i = myArray.length;
        while (i--) {
          if (myArray[i][property] === searchTerm) {
            found.push(myArray[i]);
            if (firstOnly) break; //if only the first 
          }
        }
        return found;
      },
      lookupAll: function(myArray, searchTerm, property) {
        return this.lookup(myArray, searchTerm, property, false);
      },
      remove: function(myArray, searchTerm, property, firstOnly) {
        for (var i = myArray.length - 1; i >= 0; i--) {
          if (myArray[i][property] === searchTerm) {
            myArray.splice(i, 1);
            if (firstOnly) break; //if only the first term has to be removed
          }
        }
      },
      removeByIndex: function(myArray, index) {
        myArray.splice(index, 1);
      }
    };
    myApp.func = {
      hasDuplicates: function(actor) {
        var allLast = myApp.arrayObj.lookup(myApp.data.actors, actor.lName, "lName", false);
        var allFirst = myApp.arrayObj.lookup(allLast, actor.fName, "fName", true);
        return !!allFirst.length;
      },
      appendActorRow: function(newActor) {
        myApp.data.actorsTable.append("<tr><td><a href='' class='update' data-actorid='" + newActor.actorId + "'>" + newActor.fName + " " + newActor.lName + "</a></td></tr>");
      },
      getActor: function() {
        var newActor = {
          fName: $("#fName").val(),
          lName: $("#lName").val(),
          gender: $("input[type=radio][name='gender']:checked").val(),
          birthDate: $("#birthDate").val(),
          action: $("#action").prop('checked'),
          comedy: $("#comedy").prop('checked'),
          drama: $("#drama").prop('checked'),
          suspense: $("#suspense").prop('checked'),
          sciencefiction: $("#sciencefiction").prop('checked'),
          horror: $("#horror").prop('checked'),
          actorId: $("#fName").data('actorid')
    
        }
        return newActor;
      },
      putActor: function(actor) {
        $("#fName").val(actor.fName);
        $("#lName").val(actor.lName);
        $("input[type=radio][name='gender']").val(actor.gender);
        $("#birthDate").val(actor.birthDate);
        $("#action").prop('checked', actor.action);
        $("#comedy").prop('checked', actor.comedy);
        $("#drama").prop('checked', actor.drama);
        $("#suspense").prop('checked', actor.suspense);
        $("#sciencefiction").prop('checked', actor.sciencefiction);
        $("#horror").prop('checked', actor.horror);
        $("#fName").data('actorid', actor.actorId);
      },
      addActor: function(allowDuplicates) {
        var newActor = myApp.func.getActor();
        var validActor = false;
        if (!allowDuplicates && !myApp.func.hasDuplicates(newActor)) {
          validActor = true;
        }
        if (!validActor && allowDuplicates) {
          validActor = true;
        }
        if (validActor) {
          myApp.data.lastActorId = myApp.data.lastActorId + 1;
          newActor.actorId = myApp.data.lastActorId;
          myApp.func.appendActorRow(newActor);
          myApp.data.actors.push(newActor);
        }
        return newActor;
      },
      updateRowByIndex: function(actor, index) {
        myApp.data.actorsTable.eq(index).html(actor.fName + " " + actor.lName).data("actorid", actor.actorId).addClass('update');
      },
      updateRowByActorId: function(actor, actorId) {
        var r = myApp.data.actorsTable.find('a[data-actorid="' + actorId + '"]');
        r.html(actor.fName + " " + actor.lName).data("actorid", actor.actorId).addClass('update');
      },
      clearForm: function() {
        $('#fName').val("");
        $('#lName').val("");
        $('#birthDate').val("");
        $('#form').find('input[type="checkbox"]').prop("checked", false);
        $('#form').find('input[type="radio"]').prop("checked", false);
        return this;
      },
      selectActor: function(e) {
        e.preventDefault();
        var selectActorId = $(this).data('actorid');
        var actor = myApp.arrayObj.lookup(myApp.data.actors, selectActorId, "actorId", true)[0];
        myApp.func.putActor(actor);
        myApp.func.setButtons("old")
      },
      updateActor: function() {
        var actor = myApp.func.getActor();
        var index = myApp.arrayObj.indexOf(myApp.data.actors, actor.actorId, "actorId", true);
        if (index != -1) {
          myApp.data.actors[index] = actor;
          myApp.func.updateRowByActorId(actor, actor.actorId);
        }
      },
      deleteActor: function() {
        var actor = myApp.func.getActor();
        var index = myApp.arrayObj.indexOf(myApp.data.actors, actor.actorId, "actorId", true);
        if (index != -1) {
          var r = myApp.data.actorsTable.find('a[data-actorid="' + actor.actorId + '"]');
          r.parents('tr').remove();
          // either will work, used the index one
          //  myApp.arrayObj.remove(myApp.data.actors, actor.actorId, "actorId", true);
          myApp.arrayObj.removeByIndex(myApp.data.actors, index);
        }
        myApp.func.clearForm().setButtons("new");
        // myApp.func.setButtons("new");
      },
      setButtons: function(foo) {
        // if page is new only or form is being filled with new data
        // show 'Add Actor' button only
        $("#addNewActor").toggle((foo === "new"));
        $("#updateActor").toggle(!(foo === "new"));
        $("#deleteActor").toggle(!(foo === "new"));
      }
    };
    myApp.data = {
      actors: [],
      actorsTable: $("#actorsTable"),
      lastActorId: 0
    };
    /* end of myApp */
    
    // Function checks state of page and shows/hides buttons
    var actorStatex = function(foo) {
      // if page is new only or form is being filled with new data
      // show 'Add Actor' button only
      $("#addNewActor").toggle((foo === "new"));
      $("#updateActor").toggle(!(foo === "new"));
      $("#deleteActor").toggle(!(foo === "new"));
    };
    
    var validateForm = function(e) {};
    
    $(document).ready(function() {
    
      $('#results').on('click', '.update', myApp.func.selectActor);
      $("#birthDate").datepicker();
      myApp.func.setButtons("new");
      $("#addNewActor").on('click', function() {
        var addedActor = myApp.func.addActor(false);
      });
      $("#updateActor").on('click', myApp.func.updateActor);
      $("#deleteActor").on('click', myApp.func.deleteActor);
      $("#clearButton").on('click', function() {
        myApp.func.clearForm();
        myApp.func.setButtons("new");
      });
    });
    

    【讨论】:

    • 不知道该说什么,除了谢谢。我可能应该提到我是 JS 的新手,因为这只是我使用它的第四个实验室,所以你所做的很多事情对我来说都是全新的。我相信你可以从我的代码中看出。在查看了您的命名空间的工作原理之后,我在一定程度上得到了它,但我将不得不使用本地存储来构建这个任务,并使用 PHP 连接到 MySQL 数据库。对于我可以查看的内容,您是否有任何提示或资源可以帮助我更多地了解其工作原理或解决相同问题的其他方法?再次感谢。
    • 查看addyosmani.com/blog/essential-js-namespacing 他讨论命名空间的地方,我使用的模式也在那里。您可以搜索主题的其他概念,例如使用对象数组(即对象数组)。对于这个答案,只需检查每个功能的功能/优点,不要被整个事情淹没。我在myApp.arrayObj 中分组了通用的东西,在myApp.func 中分组了特定于您的功能的东西
    • 请注意我是如何将函数分解为在 clearForm: function() { 和 setButtons 等实例中只做一件事的。然后我可以创建/测试它们,然后继续前进,使其更易于维护。我可以像在复选框上一样通过查找输入类型来使“clearForm”通用化,传递表单名称,然后将其用于例如通过表单清除“范围”。
    • 去阅读 angularjs.org 、 facebook.github.io/react 和其他库的源代码,看看其他人是如何做一些非常好的事情的。 JavaScript 是一种原型语言搜索,它意味着什么。一定比例的编码总是关于学习更多;任何有价值的活动都一样。你也可以去阅读这里的规格列表:developer.mozilla.org/en-US/docs/Web/JavaScript/…
    • 请注意,我在那里留下了一个var actorStatex = 全局函数,我不使用它,但随后将其重构为“setButtons”函数,因此如果/当您使用它时,请将其删除;我只留下它来展示我是如何重构你的 .show() 和 .hide() 以使用 .toggle 代替
    【解决方案2】:

    这是因为警报中的属性名称与 newActor 对象中的名称不匹配。

    你应该使用 alert(actors[row].fName) 而不是 alert(actors[row].fname)

    顺便说一句,您可以使用表单 ID #actorForm 使其变得更简单

    应该是这样的(我没测试过)

    var actors = [], index = 0;
    
    $("#addNewActor").click(function() {
         var newActor = $('#actorForm').serialize();
    
         $("#actorsTable").append("<tr><td><a href='' class='update'>" + newActor.fName + " " + newActor.lName + "</a></td></tr> ");
        actors.push(newActor);
    });
    
    // select actor
    $(document).on('click', '#actorsTable tr', function() {
        if(actors[$(this).index]) {
            index = $(this).index();
            var actor = actors[index];
            // populate your form
        }
    });
    $("#updateActor").click(function() {
        var newActor = $('#actorForm').serialize();
        actors[index] = newActor;
    });
    $("#deleteActor").click(function() {
        actors.splice(index, 1);
    });
    

    【讨论】:

    • 是的,那是打字错误,谢谢。但这仍然不能帮助我将对象加载回表单以进行编辑/删除。
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2022-01-17
    • 1970-01-01
    • 2018-01-15
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多