Как повторно заполнить 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/

Другие вопросы по тегам