Ich bin ein Backbone-Beispiel zusammen, in dem Modelle erstellt bearbeitet und gelöscht werden. Ich kann neue Modelle speichern und in den lokalen Speicher ändern, habe aber ein Problem damit, dass der lokale Speicher bei der Aktualisierung korrekt angezeigt wird. Es scheint, als ein einzelnes Objekt geladen zu werden, und gibt mir daher ein Modell unabhängig davon, wie viele hinzugefügt wurden.mit localStorage in Backbone.js
Antwort
var Thing = Backbone.Model.extend({
defaults: {
title: 'blank'
}
});
var ThingView = Backbone.View.extend({
template: _.template('<b><button id="remove">X</button> <b><button id="edit">Edit</button> <%= title %></b>'),
editTemplate: _.template('<input class="name" value="<%= name %>" /><button id="save">Save</button>'),
events: {
"click #remove": "deleteItem",
"click #edit": "editItem",
"click #save": "saveItem",
},
deleteItem: function() {
console.log('deleted');
this.model.destroy();
this.remove();
},
editItem: function() {
console.log('editing');
this.$el.html(this.editTemplate(this.model.toJSON()));
},
saveItem: function() {
console.log('saved');
editTitle = $('input.name').val();
console.log(editTitle);
this.model.save({
title: editTitle
});
this.$el.html(this.template(this.model.toJSON()));
},
render: function() {
var attributes = this.model.toJSON();
this.$el.append(this.template(attributes));
return this;
}
});
var ThingsList = Backbone.Collection.extend({
model: Thing,
localStorage: new Store("store-name"),
});
var storeVar = localStorage["store-name-7ee7d1e3-bbb7-b3e4-1fe8-124f76c2b64d"];
console.log(storeVar);
var thingsList = new ThingsList;
//thingsList.reset(storeVar);
var ThingsListView = Backbone.View.extend({
el: $('body'),
events: {
'click #add': 'insertItem',
},
initialize: function() {
thingsList.fetch();
thingsList.toJSON();
this.render();
this.collection.on("add", this.renderThing, this);
},
insertItem: function (e) {
newTitle = $('input').val();
newThing = new Thing({
title: newTitle
});
this.collection.add(newThing);
newThing.save();
console.log(this.collection.length);
},
render: function() {
_.each(this.collection.models, function (items) {
this.renderThing(items);
}, this);
},
renderThing: function (items) {
var thingView = new ThingView({
model: items
});
this.$el.append(thingView.render().el);
}
});
var thingsListView = new ThingsListView({
collection: thingsList
});
Sie müssen die Elemente zu Ihrer Sammlung hinzufügen, und um sie dann zu lesen, müssen Sie abrufen abrufen. Sie haben auch ein paar zusätzliche abschließende Kommas in Ihren Objekten.
Hier ist eine leicht modifizierte Version Ihres Codes, die zu funktionieren scheint.
var Thing = Backbone.Model.extend({
defaults:{
title:'blank'
}
});
var ThingView = Backbone.View.extend({
//el: $('body'),
template: _.template('<b><button id="remove">X</button> <b><button id="edit">Edit</button> <%= title %></b>'),
editTemplate: _.template('<input class="name" value="<%= name %>" /><button id="save">Save</button>'),
events: {
"click #remove": "deleteItem",
"click #edit": "editItem",
"click #save": "saveItem",
},
deleteItem: function(){
console.log('deleted');
this.model.destroy();
//remove view from page
this.remove();
},
editItem: function(){
console.log('editing');
this.$el.html(this.editTemplate(this.model.toJSON()));
},
saveItem: function(){
console.log('saved');
editTitle = $('input.name').val();
console.log(editTitle);
this.model.save({title: editTitle});
this.$el.html(this.template(this.model.toJSON()));
},
render: function(){
var attributes = this.model.toJSON();
this.$el.append(this.template(attributes));
return this;
}
});
var storeVar = localStorage.getItem("store-name");
var ThingsList = Backbone.Collection.extend({
model: Thing,
localStorage: new Store("store-name")
});
var things = [
{ title: "Macbook Air", price: 799 },
{ title: "Macbook Pro", price: 999 },
{ title: "The new iPad", price: 399 },
{ title: "Magic Mouse", price: 50 },
{ title: "Cinema Display", price: 799 }
];
console.log(things);
var thingsList = new ThingsList;
var ThingsListView = Backbone.View.extend({
el: $('body'),
events: {
'click #add': 'insertItem'
},
initialize: function() {
this.render();
this.collection.on("add", this.renderThing, this);
},
insertItem: function(e){
newTitle = $('input').val();
newThing = new Thing({ title: newTitle });
this.collection.add(newThing);
newThing.save();
//this.model.saveItem;
console.log(this.collection.length);
},
render: function(){
_.each(this.collection.models, function (items) {
this.renderThing(items);
}, this);
},
renderThing: function(items) {
//console.log('added something');
var thingView = new ThingView({ model: items });
items.save();
this.$el.append(thingView.render().el);
}
});
var thingsListView = new ThingsListView({collection: thingsList});
thingsList.fetch();
console.log(thingsList.toJSON());
thingsList.reset(things);
Edit: Ich sehe Sie versuchen, im lokalen Speicher gespeichert unter „store-namen“, die Art und Weise Backbone-local arbeitet im Wert zu lesen ist, dass es den Namen des Ladens verwendet (in Ihrem Fall "Store-Name"), um die IDs der übrigen Modelle zu speichern, und speichert dann jedes Modell unter einer Kombination aus dem Geschäftsnamen und der ID. Sagen wir also, Sie hätten drei Modelle, dann hätten Sie 4 Einträge im lokalen Speicher ,
localStorage["store-name"] //id1, id2, id3"
localStorage["store-name-id1"] //model with id1
localStorage["store-name-id2"] // model with id2
localStorage["store-name-id3"] // model with id3
EDIT 2
Hier ist ein Link zu einem jsfiddle Ihres Codes, um zu starten Ich verlasse die Linie thingsList.fetch();
auskommentiert, kommentieren Sie diese Zeile und Kommentar aus thingsList.add(things);
und führen Sie es ein zweites Mal und es sollte die Modelle aus dem lokalen Speicher ziehen (ich verließ eine Warnung in dort).
Danke für die Antwort Jack. Leider scheint dies nicht zu funktionieren, da nichts von localStorage auf der Seite angezeigt wird. Auch habe ich festgestellt, dass ich vorher eine frühere Version der App gepostet habe. Ich habe oben bearbeitet und ersetzte es durch die neuere Version, die auf localStorage speichert, aber nicht richtig davon liest. – user1469779
Ich glaube, Ihr Problem ist, dass Sie versuchen, die Daten direkt von localStorage falsch zu lesen, ich aktualisierte meine Antwort mit einigen weiteren Details. – Jack
danke Jack, aber das funktioniert immer noch nicht. Wenn ich auf var storeVar = localStorage.getItem ("store-name-id1"); Konsole.log (storeVar); Es gibt null zurück. Ist meine Syntax falsch? – user1469779
- 1. Umgang mit Beziehungen in backbone.js
- 2. Angularjs Localstorage mit Objekt
- 3. mit LocalStorage ionic 2
- 4. localStorage mit verschiedenen Personen
- 5. Paginierung mit backbone.js
- 6. Selektive history.back() mit Backbone.js
- 7. Persistent localStorage in Awesomium
- 8. gefälschte Modellantwort in backbone.js
- 9. Seitenumbruch in Backbone.js
- 10. mit localStorage zu speichern Zahlen
- 11. Keypress in backbone.js?
- 12. ng-show mit localStorage Wahl
- 13. Download Excel in Backbone.js
- 14. Verwendung von LocalStorage mit Angular
- 15. LocalStorage nicht persistent mit Phonegap
- 16. Aktive Klasse mit localStorage hinzufügen
- 17. format sammlung in backbone.js
- 18. in Backbone.js Ereignisse
- 19. Backbone.js: URLRoot mit http-Abfragezeichenfolge?
- 20. localStorage Verschlüsselungsalgorithmen
- 21. LocalStorage Fehler
- 22. Backbone.js Projektkonfiguration
- 23. Speicher von Schlüsselwertanordnung in localstorage
- 24. sessionStorage über localStorage in PhoneGap
- 25. Wie funktioniert localStorage in HTML5?
- 26. localStorage in einer Firefox-Erweiterung
- 27. Hinzufügen von access_token in backbone.js
- 28. automatische Update-Ansicht in backbone.js
- 29. Backbone.js Synchronisierungsereignis in der Sammlung
- 30. Paperclip image.url in Backbone.js Ansichten
Konnte nimm einen kleinen Kommentar darüber, was genau du hier gemacht hast. Hast du diese Zeile wirklich kommentiert und jetzt ist alles glücklich? Warum hat es funktioniert? Was war an erster Stelle falsch? –