2016-08-30 37 views
-2

我在debutante中使用javascript,我试图提供id的自动生成机制,但它不起作用。你可以帮我吗? 这是我的datascource:jQuery,当动态添加元素时增加id号

var datascource = { 
    'id':'1' ,'name': 'Lao Lao', 
    'title': 'general manager', 
    'children': [ 
    { 'id':'2','name': 'Bo Miao', 'title': 'department manager', 'className': 'middle-level', 
     'children': [ 
     { 'id':'3','name': 'Li Jing', 'title': 'senior engineer', 'className': 'product-dept' }, 
     { 'id':'4','name': 'Li Xin', 'title': 'senior engineer', 'className': 'product-dept', 
      'children': [ 
      { 'id':'5','name': 'Ta Ta', 'title': 'engineer', 'className': 'pipeline1' }, 
      { 'id':'6','name': 'Fei Fei', 'title': 'engineer', 'className': 'pipeline1' }, 
      { 'id':'7','name': 'Xuan Xuan', 'title': 'engineer', 'className': 'pipeline1' } 
      ] 
     } 
     ] 
    }, 
    { 'id':'8','name': 'Su Miao', 'title': 'department manager', 'className': 'middle-level', 
     'children': [ 
     { 'id':'9','name': 'Pang Pang', 'title': 'senior engineer', 'className': 'rd-dept' }, 
     { 'id':'10','name': 'Hei Hei', 'title': 'senior engineer', 'className': 'rd-dept', 
      'children': [ 
      { 'id':'11','name': 'Xiang Xiang', 'title': 'UE engineer', 'className': 'frontend1' }, 
      {'id':'12', 'name': 'Dan Dan', 'title': 'engineer', 'className': 'frontend1' }, 
      { 'id':'13','name': 'Zai Zai', 'title': 'engineer', 'className': 'frontend1' } 
      ] 
     } 
     ] 
    } 
    ] 
}; 

这是用于添加节点我的功能:

$('#btn-add-input').on('click', function() { 
    $('#new-nodelist').append('<li ><input type="text" class="new-node"></li>'); 
}); 

$('#btn-remove-input').on('click', function() { 
    var inputs = $('#new-nodelist').children('li'); 
    if (inputs.length > 1) { 
    inputs.last().remove(); 
    } 
}); 

$('#btn-add-nodes').on('click', function() { 
    var $chartContainer = $('#chart-container'); 
    var nodeVals = []; 
    $('#new-nodelist').find('.new-node').each(function(index, item) { 
    var validVal = item.value.trim(); 
    if (validVal.length) { 
     nodeVals.push(validVal); 
    } 
    }); 

这是我的函数来生成的ID每个元素加入:

(function(){ 
var counter = 13; (the last id in the datascource) 
window.uniqueId = function(){ 
return counter++ 
} 
}); 

$('.new-node').each(function (i, e) { 
var name = uniqueId(); 
$(e).find(':input').each(function (j, f) { 
var id = uniqueId(); 
$(f).attr('name', name) 
.attr('id', id) 
.next() 
.attr('title', title); 
}) 
}); 

有在我目前的代码中有几个问题。你可以帮我吗 ?

+0

你能过去的代码中的问题 – Simo

+0

把所有的代码在jsfiddle.net,我们可以尝试修复它。 –

+0

你甚至没有告诉我们你的程序要求是什么或者你的函数的哪些部分没有工作...... – Adjit

回答

0

对于你的问题的一部分,这是“我怎么找到一个JSON对象的最高ID”

我使用封闭的解决了这个问题

var getHighestID = function() { 
    var highestID = 0; 
    function searchID(jsonObj){ 
     for (var key in jsonObj) { 
     if (jsonObj.hasOwnProperty(key)) { 
      if(jsonObj[key] !== null && typeof jsonObj[key] === 'object'){ 
      searchID(jsonObj[key]); 
      }else{ 
      if(key == "id"){ 
       if(parseInt(jsonObj[key]) > parseInt(highestID)){ 
       highestID = parseInt(jsonObj[key]); 
       } 
      } 
      } 
     } 
     } 
    } 
    return { 
     calculate: function(jsonObj) { 
     searchID(jsonObj); 
     }, 
     value: function() { 
     return highestID; 
     } 
    } 
}; 

然后你只需创建对象并要求它找到最高的ID。

var highestID = getHighestID(); 
highestID.calculate(datascource); 
var currentHighestID = highestID.value(); 

如果必须多次执行此操作并且删除行。你也应该添加一个reset()函数。

下面是一个JSFIDDLE

+0

我试过最高ID的方法,但我没有分配这个节点ID恢复添加它仍然给出了相同的错误 – sasa

+0

@sasa我不明白你的直接问题,你必须把问题的范围缩小到更具体。 上面提到的方法只是在JSON对象中查找当前最高的ID。 如果你必须添加一个新的ID,你应该检查“什么是当前最高的ID和增量”,然后用新的JSON对象替换。 – Sprazer

+0

这就是我所做的,但我不知道为什么不afonctionne和添加的id没有分配给节点https://jsfiddle.net/g5hLo0bo/8/ – sasa