【问题标题】:ExtJS column rendererExtJS 列渲染器
【发布时间】:2015-02-02 10:32:21
【问题描述】:

我的问题是 ExtJS 4 中 GridPanel 中列的渲染器函数。渲染器的记录应该从我的商店加载我的列表中的一个元素,它确实如此;但它总是加载列表的相同元素。

这是我的代码的相关sn-ps。

首先是我的商店:

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++;
    }
}

对代码进行了改编和删减。

这是picture of the result:

通常网格中的单元格应显示我的商店中列表的计数元素。

谁能帮我理解我做错了什么?

【问题讨论】:

  • 抱歉格式错误
  • 我不清楚您在此处如何配置 GridPanel,但显然 c 不是您所期望的。可能你可以用另一种方式管理'c'? - 您的商店中似乎只有一条记录,所以也许您可以从传递给渲染器的其他值推断“c”?例如,传递的第四个参数是“rowIndex”,第五个参数是“colIndex”,所以类似于 c = (rowIndex) * 7 + colIndex + 1; (假设你总是连续 7 天)?
  • 我的商店中有更多记录取决于员工人数。一排有超过 7 天。这取决于一个月的长度。

标签: javascript extjs4 renderer


【解决方案1】:

问题是:

在 JavaScript 中,函数包含在其自身范围之外的范围内定义的变量,这样它们具有对变量的“实时”引用,而不是在任何特定时间对其值的快照。

Understanding variable capture by closures in Javascript/Node 和 How do JavaScript closures work?

由于 'c' 或 'counter' 在调用使用 'c' 的方法之前完全递增,因此 '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]();
}

【讨论】:

  • 没错。另一种说法是 c 被所有不同的渲染器共享。
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多