【问题标题】:Edit an object in an array and display information编辑数组中的对象并显示信息
【发布时间】:2017-04-22 17:54:58
【问题描述】:

我有一个对象数组 (myData),其中包含类型为“内部”和“外部”的对象。

我正在从数组中的对象中创建 class="box" 的 div,并显示相应对象的一些信息。

我在 div.box 中有一个编辑按钮,只有当我的对象类型为 =“external”时。

单击编辑按钮后,我应该能够在包含输入字段的模式或弹出窗口中编辑数据。这些输入字段将显示数组中该特定对象的每个属性的值。 因此,单击编辑时,我想更新“myData”数组中该对象的信息(公司或网址)。另外,在显示的 div 中,我想显示更新的信息。

我如何做到这一点?

代码如下:

var myData = [{company: "ABC", url:"www.abc.com", type:"internal"},{company: "CDE", url:"www.cde.com", type:"internal"},{company: "DEF", url:"www.def.com", type:"external"},{company: "EFG", url:"www.efg.com", type:"internal"},{company: "FGH", url:"www.fgh.com", type:"external"}];

$('#createData').click(function(){
  createDisplay();
});

function createDisplay(){
  myData.forEach(function(obj){
    $('.container').append(
      $('<div>').addClass('box').append(
        $('<label>').text('Company Website: '),
        $('<a>').addClass('compUrl').attr('href', obj.url).text(obj.company),
        obj.type =='external'? $('<br /><button>').addClass('.edit-btn').text('Edit'): ''
      )
    )
  });
}
.box{
  height: 100px;
  background-color: skyblue;
  border: 1px solid black;
  margin-top: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<div class="container">
			
</div>

<button id="createData">Create divs</button>

【问题讨论】:

  • 您打算如何编辑数据。通过显示输入而不是数据?
  • 点击编辑会发生什么?

标签: jquery arrays object dom dynamic


【解决方案1】:

编辑对象中的数据并更新显示(假设您可以访问新数据)

$("body").on("click", ".edit-btn", function(){
   $anchor = $(this).siblings("a.compUrl");
   var name = $anchor.text();
   var objIndex = myData.findIndex(function(el) {
    return el.company == name
   });
   // var newCompanyName = "";
   // var newCompanyUrl =  "";
   myData[objIndex] = {
    "company": newCompanyName,
    "url": newCompanyUrl,
    "type": "external"
   };
   $anchor.attr('href', newCompanyUrl).text(newCompanyName);
});

编辑:更新代码以包含用于保存新数据的弹出窗口。

<div class="modal fade" id="updateData" tabindex="-1" role="dialog" aria-labelledby="update-data" aria-hidden="true">
   <div class="modal-dialog">
      <div class="modal-content">
         <!-- Modal Header -->
         <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal">
            <span aria-hidden="true">&times;</span>
            <span class="sr-only">Close</span>
            </button>
            <h4 class="modal-title" id="myModalLabel">Update Data</h4>
         </div>
         <!-- Modal Body -->
         <div class="modal-body">
            <div class="form-group">
               <label class="col-sm-2 control-label" for="companyName">Company Name</label>
               <div class="col-sm-10">
                  <input type="text" class="form-control" id="companyName" placeholder="Company Name" />
               </div>
            </div>
            <div class="form-group">
               <label class="col-sm-2 control-label" for="companyUrl">Company URL</label>
               <div class="col-sm-10">
                  <input type="text" class="form-control" id="companyUrl" placeholder="Company URL" />
               </div>
            </div>
            <input type="hidden" value="" id="targetRow">
         </div>
         <!-- Modal Footer -->
         <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
            </button>
            <button type="button" class="btn btn-primary" id="saveNewData">
            Save changes
            </button>
         </div>
      </div>
   </div>
</div>

还有 JS

$("body").on("click", ".edit-btn", function() {
  var row = $(this).closest('.box').index();
  $("#targetRow").val(row);
  $("#updateData").modal("show");
});
$("body").on("click", "#saveNewData", function() {
  //Validate the new Data
  if (valid) {
    updateData();
    $("#companyName, #companyUrl, #targetRow").val("");
    $("#updateData").modal("hide");
  }
});

function updateData() {
  var rowIndex = $("#targetRow").val(),
    row = $(".container").find(".box").eq(rowIndex),
    newCompanyName = $("#companyName").val(),
    newCompanyUrl = $("#companyUrl").val();
  $anchor = row.find("a.compUrl");
  var name = $anchor.text();
  var objIndex = myData.findIndex(function(el) {
    return el.company == name
  });

  myData[objIndex] = {
    "company": newCompanyName,
    "url": newCompanyUrl,
    "type": "external"
  };
  $anchor.attr('href', newCompanyUrl).text(newCompanyName);
}

更新了fiddle中的代码

【讨论】:

  • 我需要使用弹出窗口更新信息。任何帮助表示赞赏!
  • @Sunny 我已经更新了代码以包含用于保存新数据的弹出窗口。
  • 我无法在单击编辑按钮时打开模式(弹出窗口)。不确定,有什么问题!
  • 不,但不知何故它不起作用。你能把你的代码放在小提琴或sn-p中吗?
  • @Sunny 为工作代码添加了一个小提琴。在您的代码中有 addClass('.edit-btn') 创建了问题,类名不需要“。”有了它,只有类名就可以了。所以应该是addClass('edit-btn')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2011-06-20
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多