Javascript ExtJS列渲染器

Javascript ExtJS列渲染器,javascript,extjs4,renderer,Javascript,Extjs4,Renderer,我的问题是extjs4中GridPanel中列的渲染器函数。渲染器的记录应该从我的存储中加载我列表中的一个元素,它确实加载了;但它总是加载列表中的相同元素 下面是我的代码的相关片段 首先,我的商店: var nStore = Ext.create('Ext.data.Store', { storeId: 'people', fields: ['team', 'name', 'liste', 'sums'], data: [{ team: 'TestTeam

我的问题是extjs4中GridPanel中列的渲染器函数。渲染器的记录应该从我的存储中加载我列表中的一个元素,它确实加载了;但它总是加载列表中的相同元素

下面是我的代码的相关片段

首先,我的商店:

var nStore = Ext.create('Ext.data.Store', {
    storeId: 'people',
    fields: ['team', 'name', 'liste', 'sums'],
    data: [{
        team: 'TestTeam', name: 'TestPerson',
        liste: ['F', 'F', 'F', 'S', 'N', 'F', 'S',
            'S', 'S', 'F', 'F', 'F', 'S', 'A', 'N',
            'S', 'S', 'S', 'S', '', '', 'N', 'N',
            'N', 'S', 'S', 'N', 'S', 'F', 'N', 'N'],
        sums: [[7, 4, 0, 0, 0, 0, 0], [3, 0, 0, 0, 0]]
    }]
});
然后是渲染器所在的我的列数组:

var counter = 0;
for (var i = 0; i < Object.kws.length; i++) {
    var DayOfMonth = [];
    var DayOfWeek = [];
    for (var j = 0; j < Object.kws[i].kwDays.length; j++) {
        var c = counter;
        DayOfMonth[j] = {
            text: '<span style="font-size: 87%;">' 
                    + Object.kws[i].kwDays[j].day 
                    + '.<br>' 
                    + Object.kws[i].kwDays[j].dayOfWeek
                    + '.</span>', sortable: false,
            draggable: false, menuDisabled: true,
            resizable: false, width: 40, align: 'center',
            renderer: function (value, meta, record) {
                return record.data.liste[c];

            }
        };
        counter++;
    }
}
var计数器=0;
对于(变量i=0;i”
+Object.kws[i].kwDays[j].dayOfWeek
+“.”,可排序:false,
可拖动:错误,菜单禁用:正确,
可调整大小:false,宽度:40,对齐:“居中”,
渲染器:函数(值、元、记录){
返回record.data.liste[c];
}
};
计数器++;
}
}
该守则经过改编和删节

以下是一份:

通常,网格中的单元格应该显示我的存储中列表的计数元素

有人能帮我理解我做错了什么吗?

问题是:

在JavaScript中,函数将在其自身范围之外的范围内定义的变量封装起来,这样它们就有了对变量的“活”引用,而不是在任何特定时间对其值的快照

由于在调用使用“c”的方法之前,“c”或“counter”已完全递增,“c”的值始终是for循环中获得的最高值。要解决此问题,您需要在创建渲染器函数时捕获“c”的值。此代码说明了问题以及如何获取价值以实现预期效果:

var counter = 0;
var dayOfMonths = [];
var dayOfMonthCaptured = [];
 for (var i = 0; i < 10; i++) {
  var c = counter;
  console.log(c);
  dayOfMonths.push(function () { 
    var index = c;
    //since counter is incremented fully before this method is called, you get the last value
    console.log(index); 
  });
  //here we pass the current value of c to a new function and capture its current value
  dayOfMonthCaptured.push((function (index) {
      return function () { 
        console.log(index); 
      };
   })(c));
  counter++;
}
//this won’t work
for (day in dayOfMonths) {
  dayOfMonths[day]();
}
console.log("—————————");
for (day in dayOfMonthCaptured) {
  dayOfMonthCaptured[day]();
}
var计数器=0;
var dayOfMonths=[];
var dayOfMonthCaptured=[];
对于(变量i=0;i<10;i++){
var c=计数器;
控制台日志(c);
push(函数(){
var指数=c;
//由于在调用此方法之前计数器已完全递增,所以您将获得最后一个值
控制台日志(索引);
});
//在这里,我们将c的当前值传递给一个新函数并捕获它的当前值
push((函数(索引))的日期{
返回函数(){
控制台日志(索引);
};
})(c) );
计数器++;
}
//这行不通
用于(月的第几天){
月之日[日]();
}
console.log(“-----------”;
for(捕获的月份中的天){
月日[日]();
}

很抱歉,格式不好。我不清楚您是如何配置GridPanel的,但显然c不是您所期望的。也许你可以用另一种方式管理“c”?-您的存储中似乎只有一条记录,所以您可以从传递给渲染器的其他值推断出“c”?例如,传递的第四个参数是'rowIndex',第五个参数是'colIndex',因此类似于c=(rowIndex)*7+colIndex+1;(假设你总是连续七天)?我的商店里有更多的记录取决于员工数量。连续7天以上。这取决于一个月的长度。没错。另一种说法是c被所有不同的渲染器共享。