Javascript 根据JSON数据添加类

Javascript 根据JSON数据添加类,javascript,jquery,json,Javascript,Jquery,Json,使用JSON数据动态生成的HTML,我试图向每个.status卡添加一个类,在本例中,这取决于c.callStatus的值。这是我得到的最接近的,但这只是将活动类添加到所有状态卡。我猜这与我如何使用$(这个)有关,还是我遗漏了其他东西 $(function() { var agents = []; $.getJSON('js/agents.json', function(a) { $.each(a.agents, function(b, c) {

使用JSON数据动态生成的HTML,我试图向每个
.status卡添加一个类,在本例中,这取决于
c.callStatus
的值。这是我得到的最接近的,但这只是将
活动
类添加到所有
状态卡
。我猜这与我如何使用
$(这个)
有关,还是我遗漏了其他东西

$(function() {
    var agents = [];
    $.getJSON('js/agents.json', function(a) {
        $.each(a.agents, function(b, c) {
            var content = 
            '<div class="status-card">' +
            '<div class="agent-details">' +
            '<span class="agent-name">' + c.name + '</span>' +
            '<span class="handling-state">' + c.callStatus + '</span>' +
            '<span class="handling-time">' + c.handlingTime + '</span>' +
            '</div>' +
            '<div class="status-indicator"></div>' +
            '</div>'
            $(content).appendTo('#left');

            //Add class depending on callStatus
            $('.status-card').each(function() {
              if (c.callStatus == 'On Call') {
                $(this).removeClass('idle away').addClass('active');
              } else if (c.callStatus == 'Idle') {
                $(this).removeClass('active away').addClass('idle');
              } else {
                $(this).removeClass('active idle').addClass('away');
              }
              console.log(c.callStatus);
            });
        });

    });

});
$(函数(){
var代理=[];
$.getJSON('js/agents.json',函数(a){
$。每个(a.代理,功能(b,c){
变量内容=
'' +
'' +
''+c.name+''的+
“+c.callStatus+”+
''+c.处理时间+''+
'' +
'' +
''
$(content).appendTo('左');
//根据callStatus添加类
$('.status card')。每个(函数(){
如果(c.callStatus=='On Call'){
$(this).removeClass('idle-away').addClass('active');
}否则,如果(c.callStatus=='Idle'){
$(this).removeClass('active away').addClass('idle');
}否则{
$(this).removeClass('active idle').addClass('away');
}
console.log(c.callStatus);
});
});
});
});

谢谢

这是因为您的
状态卡
每个循环都嵌套在JSON循环中。因此,每次从JSON数据循环一个对象时,您都在设置所有已添加到DOM中的
状态卡
元素的类

在追加元素之前,可以在构建元素时重新构造以设置类

    $.each(a.agents, function(b, c) {
        var content = 
        '<div class="agent-details">' +
        '<span class="agent-name">' + c.name + '</span>' +
        '<span class="handling-state">' + c.callStatus + '</span>' +
        '<span class="handling-time">' + c.handlingTime + '</span>' +
        '</div>' +
        '<div class="status-indicator"></div>';

        var $statusCard = $("<div/>").addClass("status-card");
                                     .append(content);

        $statusCard.addClass(function(){
             switch(c.callStatus){
                case "On Call":
                   return "active";
                case "Idle":
                   return "idle";
                default:
                   return "away";
             }
        }());

        $statusCard.appendTo('#left');


    });
$。每个(a.代理,函数(b,c){
变量内容=
'' +
''+c.name+''的+
“+c.callStatus+”+
''+c.处理时间+''+
'' +
'';
var$statusCard=$(“”)。addClass(“状态卡”);
.附加(内容);
$statusCard.addClass(函数(){
开关(c.callStatus){
“待命”案件:
返回“活动”;
案例“空闲”:
返回“空闲”;
违约:
返回“离开”;
}
}());
$statusCard.appendTo(“#左”);
});
这是我得到的最接近的,但这只是将
活动
类添加到所有
状态卡

发生这种情况的原因是,在添加每个
状态卡之后,您正在向迄今为止添加的所有状态卡添加其他类:

$.each(a.agents, function(b, c) {
 ....
    // here you are updating the class for all the cards added till now.
    $('.status-card').each(function() {
     ....
    });
 ....
});
因此,
active
类被添加到所有其他卡中,因为这可能是最后一个外部循环中的
callStatus

在创建HTML之前,您可以根据
callStatus
计算
className
,然后在HTML中使用该
className
,如下所示:

function getClassNameByStatus (callStatus) {
    switch(callStatus){
        case "On Call":
            return "active";
        case "Idle":
            return "idle";
        default:
            return "away";
    }
}

$.each(a.agents, function(b, c) {
    var className = getClassNameByStatus(c.callStatus);
    var content =
        '<div class="status-card' + className + '">' +
        ....; // rest of the HTML
    $(content).appendTo('#left');
});
函数getClassNameByStatus(callStatus){ 开关(呼叫状态){ “待命”案件: 返回“活动”; 案例“空闲”: 返回“空闲”; 违约: 返回“离开”; } } $。每个(a.代理,功能(b,c){ var className=getClassNameByStatus(c.callStatus); var含量= '' + ..;//HTML的其余部分 $(content).appendTo('左'); });
您正在调用
$('.status card')。对于
a.agents
列表中的每个
agent
。因此,在最后一次迭代中,所有
.status card
元素将具有最后一个
agent.callStatus
求值类

我会写这样的东西

$(function() {                                                                                                                                                                                                                                 
  function createStatusCard(name,callStatus,handlingTime) {                                                                                                                                                                                    
    var status_class_map = {                                                                                                                                                                                                                   
      "On Call" : "active",                                                                                                                                                                                                                    
      "Idle" : "idle"                                                                                                                                                                                                                          
    };                                                                                                                                                                                                                                         
    var $content = $("<div/>").addClass("status-card").addClass(function(){                                                                                                                                                                    
      return status_class_map[callStatus] || "away";                                                                                                                                                                                           
    });                                                                                                                                                                                                                                        
    $content.html('<div class="agent-details">' +                                                                                                                                                                                              
      '<span class="agent-name">' + name + '</span>' +                                                                                                                                                                                         
      '<span class="handling-state">' + callStatus + '</span>' +                                                                                                                                                                               
      '<span class="handling-time">' + handlingTime + '</span>' +                                                                                                                                                                              
      '</div>' +                                                                                                                                                                                                                               
      '<div class="status-indicator"></div>');                                                                                                                                                                                                 
    return $content;                                                                                                                                                                                                                           
  }                                                                                                                                                                                                                                            
  $.getJSON('agents.json', function(a) {                                                                                                                                                                                                       
    $.each(a.agents, function(b, c) {                                                                                                                                                                                                          
      $("#left").append(createStatusCard(c.name,c.callStatus,c.handlingTime));                                                                                                                                                                 
    });                                                                                                                                                                                                                                        
  });                                                                                                                                                                                                                                          
}); 
$(函数(){
函数createStatusCard(名称、调用状态、处理时间){
var status_class_map={
“待命”:“有效”,
“空闲”:“空闲”
};                                                                                                                                                                                                                                         
var$content=$(“”).addClass(“状态卡”).addClass(函数(){
返回状态_类_映射[呼叫状态]| |“离开”;
});                                                                                                                                                                                                                                        
$content.html(“”+