gpt4 book ai didi

javascript - 主干 ListView /渲染 ListView 项目

转载 作者:行者123 更新时间:2023-12-02 15:58:52 25 4
gpt4 key购买 nike

我对 Backbone.js 还很陌生。请参阅我的代码以了解我在这里引用的内容。我有一个 View 应该显示“库存”模型的集合。该 View 称为“StockDashboardView”。该 View 需要的每个股票模型都可以通过“StockDashboardItemView”显示。不过,在每个 StockDashboardItemView 渲染之前,其各自的股票模型需要获取一些数据(发出股票价格请求),以便 StockDashboardItemView 可以使用这些数据来绘制图表。 StockDashboardView 循环遍历每个 Stock 模型,并为每个模型创建一个 StockDashboardItemView。我应该得到 5 个不同的图表,每个图表都有不同的公司数据点。但所有图表都是相同的,这意味着 5 个 StockDashboardItemView 中的每一个都以某种方式具有相同的模型。我知道我的获取/循环逻辑是错误的,但我不知道如何或为什么。我还尝试获取单个 StockDashboardItemViews 而不是 StockDashboardView (请参阅注释掉的代码)。查看我的 console.log 语句,我看到以下打印语句:(该集合有 5 个模型)。有人可以帮我纠正我的逻辑吗?谢谢

----------1--------

----------1--------

----------1--------

----------1--------

----------1--------

----------2--------

----------3--------

----------2--------

----------3--------

----------2--------

----------3--------

----------2--------

----------3--------

----------2--------

----------3--------

            window.StockDashboardView = Backbone.View.extend({

initialize: function () {
this.render();
},

render: function () {
var stocks = this.model.models;
var len = stocks.length;
var startPos = (this.options.page - 1) * 8;
var endPos = Math.min(startPos + 8, len);

$(this.el).html('<ul class="thumbnails"></ul>');
for (var i = startPos; i < endPos; i++) {
console.log("----------1--------");
var stock = stocks[i];
stock.set("_id", stocks[i].toJSON()["tickerSymbol"]);
stock.fetch({success: function(model, response, options){
stock.set("data", response);
// set interactivity to false
console.log("-----------2---------");
$('.thumbnails', this.el).append(new StockDashboardItemView({model: stock}).render().el);
}});

}

$(this.el).append(new Paginator({model: this.model, page: this.options.page}).render().el);

return this;
}
});

window.StockDashboardItemView = Backbone.View.extend({

tagName: "li",

initialize: function () {
this.model.bind("change", this.render, this);
this.model.bind("destroy", this.close, this);
},

render: function () {
$(this.el).html(this.template(this.model.toJSON()));
var context = this.$("#chart_div")[0];
var stock = this.model;
stock.set("_id", stock.toJSON()["tickerSymbol"]);
//stock.fetch({success: function(model, response, options){
//stock.set("data", response);
// set interactivity to false
console.log("-----------3---------");
var chart = new TFChart(stock.get("_id"), stock.attributes['data'], context, false, this.$("#chart_div").width(), this.$("#chart_div").height());
return this;
//}});
}
});

最佳答案

for 循环 中,您使用 stock =stocks[i] 获取每个股票,然后获取它们。

但是,由于 .fetchasync 方法,当它开始执行以渲染 stock 的 View 时,您会注意到 stock 现在指向库存中的最后一项,因此它只会多次渲染最后一项。

为什么会发生这种情况?因为 var 使用函数作用域,而不是 block 作用域(在 ES6 中,有一个 let 可以使用 block 作用域,但这里有点题外话),所以所有的.fetch 的成功回调,当他们想要使用 stock 时,他们都会看到相同的 stock,这将是最后分配的值for循环,并且应该是stocks的最后一项。

这是一个作用域问题,解决方案是将上下文包装到一个函数中,这样该函数的作用域将为您保留该项目:

render: function () {
var stocks = this.model.models;
var len = stocks.length;
var startPos = (this.options.page - 1) * 8;
var endPos = Math.min(startPos + 8, len);

// Move this.el to here, so the this.el's this won't be a problem.
var thisEl = this.el;
var fetchStock = function(stock) {
stock.set("_id", stocks[i].toJSON()["tickerSymbol"]);
stock.fetch({success: function(model, response, options){
stock.set("data", response);
// set interactivity to false
console.log("-----------2---------");
$('.thumbnails', thisEl).append(new StockDashboardItemView({model: stock}).render().el);
}});
};

$(this.el).html('<ul class="thumbnails"></ul>');
for (var i = startPos; i < endPos; i++) {
console.log("----------1--------");
fetchStock(stocks[i]);
}

$(this.el).append(new Paginator({model: this.model, page: this.options.page}).render().el);

return this;
}

正如你所看到的,现在当我们调用fetchStock时,它的stock将引用当前的stocks[i],并且获胜不受其后循环的影响。

关于javascript - 主干 ListView /渲染 ListView 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31378015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com