Как повторно заполнить localstorage моделями с удаленного компьютера с одинаковыми идентификаторами, используя Backbone.dualStorage.js?
Я делаю тест. Я загружаю вопросы из файла json. Модели имеют атрибут use: Я фильтрую коллекцию по использованию и собираю идентификаторы, затем получаю случайный идентификатор для вопроса и устанавливаю значение false, когда на него получен ответ. Таким образом, пользователь будет проходить все вопросы в случайном порядке без повторов. Я хотел бы отслеживать используемые вопросы для каждого пользователя, и когда они все это сделали, сбросьте банк вопросов.
Я использую backbone.dualstorage, и это сработало один раз, а затем я попытался сбросить коллекцию, просматривая каждую модель и уничтожая ее. Теперь я не могу заполнить локальную коллекцию моделями, потому что удаленные модели имеют те же идентификаторы, что и идентификаторы уничтоженных моделей.
Как я могу снова добавить все модели из удаленной коллекции в localStorage?
//Question collection
var PlayCollection = Backbone.Collection.extend({
model: PlayModel,
url: "https://raw.githubusercontent.com/robertocarroll/barjeel-app/master/app/data/questions.json",
//when I set remote it works without local at all
//remote: function () {return true;}
});
//define new question collection
var newCollection = new PlayCollection();
// load data
newCollection.fetch({
success: function (newCollection, response, options) {
console.log("fetch questions success");
//this shows all the question IDs which I destroyed
console.log(newCollection.destroyedModelIds());
//this is empty
console.log(newCollection.dirtyModels());
}
});
function getQuestion() {
var theQuestions = newCollection.dirtyModels()[0].collection;
//get the IDs of all questions which haven't been used
var questions = theQuestions.chain()
.filter(function (m) {
return m.get('use')
})
.pluck('id')
.value();
console.log(questions);
if (questions.length > 0) {
// get random ID from question ID array
var rand = questions[_.random(questions.length - 1)];
console.log('chosen ID value: ' + rand);
//get a model from a collection, specified by ID
var currentQuestion = theQuestions.get(rand);
console.log(currentQuestion);
//set the status of that question to used
currentQuestion.set("use", false);
}
//if there's not more questions
else {
console.log("No more questions");
//delete models in local
_.chain(newCollection.models).clone().each(function (model) {
console.log('deleting model ' + model.id);
model.destroy();
});
}
}
Вот скрипка: http://jsfiddle.net/robertocarroll/10xqvk18/10/
Спасибо!
1 ответ
Оказывается, backbone.dualstorage был излишним. Я получил доступ к localStorage напрямую вместо этого:
//model for questions
PlayModel = Backbone.Model.extend({});
//model for which questions to use
PlayGameQuestionCount = Backbone.Model.extend({
defaults: {
"use": true
}
});
//Question collection
var PlayCollection = Backbone.Collection.extend({
model: PlayModel,
url: "https://raw.githubusercontent.com/robertocarroll/barjeel-app/master/app/data/questions.json"
});
//define new question collection
var newCollection = new PlayCollection();
function fetchQuestions() {
// load data
newCollection.fetch({
success: function (newCollection, response, options) {
console.log("fetch questions success");
//add data to local storage
localStorage.setItem('questions', JSON.stringify(newCollection.toJSON()));
}
});
}
function getQuestion() {
var newLocalCollection = new PlayCollection(JSON.parse(localStorage.getItem('questions')));
console.log(newLocalCollection);
//get the IDs of all questions which haven't been used
var questions = newLocalCollection.chain()
.filter(function (m) {
return m.get('use')
})
.pluck('id')
.value();
console.log(questions);
if (questions.length > 0) {
// get random ID from question ID array
var rand = questions[_.random(questions.length - 1)];
console.log('chosen ID value: ' + rand);
//get a model from a collection, specified by ID
var currentQuestion = newLocalCollection.get(rand);
console.log(currentQuestion);
//set the status of that question to used
currentQuestion.set("use", false);
localStorage.setItem('questions', JSON.stringify(newLocalCollection.toJSON()));
}
//if there's not more questions
else {
console.log("No more questions");
//delete models in local
fetchQuestions();
}
}
//function to fire the questions
$(document).ready(function () {
$("#btnSave").click(
function () {
getQuestion();
});
});
Вот скрипка: http://jsfiddle.net/hcqse7j4/3/