我使用的是backbone.js,我需要一种非常简单的方法,只需一次将本地json文件渲染到用户的本地存储中。我正在构建一个cordova应用程序,我只想使用本地存储数据。
我已经在我的收藏中硬编码了一个相当大的.json文件(播放器列表),如果设备上的本地存储为空,我只想将.json文件加载到本地存储中,而在应用程序初始化时,本地存储只有一次。
我可以使用ajax,但我不知道如何编写它,只将数据作为"启动"数据注入一次。因此,如果你知道如何做到这一点,我可以将json文件上传到我的服务器,并以某种方式获取它
如果我完成了一系列任务,我可以注入数据,我必须禁用fetch
方法,并在下面的每条语句中呈现此代码,此外json必须以特定格式硬编码到集合中。
playersCollection.create({
name: player.get('name'),
team: player.get('team'),
team_id: player.get('team_id'),
number: player.get('number'),
points: player.get('points')
})
我正在努力完成这个lol,我今晚需要用它来保持统计数据,我几乎完成了结构,当数据加载时,我可以添加统计数据等,但我需要加载数据,我祈祷有人能帮忙!
编辑:我能够在最后一分钟整理出一些草率的代码,这些代码至少起了作用,多亏了@VLS,我会有更好的解决方案,但我会发布我使用的错误代码。
// I fire renderData method on click
events: {
'click .renderData':'renderData'
},
// Inside my render method I check if "players-backbone" is in local storage
render: function() {
var self = this;
if (localStorage.getItem("players-backbone") === null) {
alert('yup null');
//playersCollection.fetch();
this.$el.append('<button class="renderData">Dont click</button>')
} else {
alert('isnt null');
this.$el.find('.renderData').remove();
playersCollection.fetch();
}
this.teams.each(function(team) {
var teamView = new TeamView({ model: team });
var teamHtml = teamView.render().el;
console.log($(''))
var teamPlayers = this.players.where({team_id: team.get('id')})
_.each(teamPlayers, function(player) {
var playerView = new PlayerView({ model: player });
var playerHtml = playerView.render().el;
$(teamHtml).append(playerHtml);
}, this);
this.$el.append(teamHtml);
}, this);
return this;
},
// method that populates local storage and fires when you click a button with the class .renderData
renderData: function() {
var self = this;
this.teams.each(function(team) {
var teamPlayers = this.players.where({team_id: team.get('id')})
_.each(teamPlayers, function(player) {
playersCollection.create({
name: player.get('name'),
team: player.get('team'),
team_id: player.get('team_id'),
number: player.get('number'),
points: player.get('points')
})
}, this);
}, this);
playersCollection.fetch();
return this;
}
这显然不是最好的方法,但它奏效了,我当时很着急。需要注意的是,你必须点击一个填充数据的按钮,集合是硬编码的,只是总体上不太优雅(但它很有效),应用程序做了它需要的事情。
非常感谢@VLS,我感谢您为解释代码和创建小提琴所做的努力。对不起我来晚了!
您可以扩展您的收藏的fetch
方法,并将其与Backbone.localStorage结合使用,因此在您的收藏中您会有以下内容:
localStorage: new Backbone.LocalStorage("TestCollection"),
fetch: function(options) {
// check if localStorage for this collection exists
if(!localStorage.getItem("TestCollection")) {
var self = this;
// fetch from server once
$.ajax({
url: 'collection.json'
}).done(function(response) {
$.each(response.items, function(i, item) {
self.create(item); // saves model to local storage
});
});
} else {
// call original fetch method
return Backbone.Collection.prototype.fetch.call(this, options);
}
}
演示:http://jsfiddle.net/5nz8p/
有关Backbone.localStorage的更多信息:https://github.com/jeromegn/Backbone.localStorage