backbone.js必须定义url属性
我正在尝试使用Backbone.localStorage作为应用程序的后端 我写了一个叫做Era的模型,以及相应的EraView。在EraView中按enter键会保存模型,这就是我得到错误的原因:backbone.js必须定义url属性,backbone.js,backbone-model,Backbone.js,Backbone Model,我正在尝试使用Backbone.localStorage作为应用程序的后端 我写了一个叫做Era的模型,以及相应的EraView。在EraView中按enter键会保存模型,这就是我得到错误的原因: Uncaught Error: A "url" property or function must be specified urlError backbone.js:1509 _.extend.url backbone.js:515 _.result underscore
Uncaught Error: A "url" property or function must be specified
urlError backbone.js:1509
_.extend.url backbone.js:515
_.result underscore-min.js:1060
Backbone.sync backbone.js:1410
Backbone.sync backbone.localStorage.js:188
_.extend.sync backbone.js:276
_.extend.save backbone.js:476
karass.EraView.Backbone.View.extend.close era.js:61
karass.EraView.Backbone.View.extend.updateOnEnter era.js:75
下面是EraView的代码
var karass = karass || {};
// Era Item View
// the DOM element for an era item
karass.EraView = Backbone.View.extend({
tagName: 'li',
className: 'era',
template: _.template( $('#era-template').html() ),
// The DOM events specified to an item
events: {
'dblclick .edit-input': 'edit',
'keypress .edit-input': 'updateOnEnter',
//'blur .edit': 'close',
},
// The EraView listens for changes to its model, re-rendering. Since there's
// a one-to-one correspondence between an era and a EraView in this karass,
// we set a direct reference on the model for convenience.
initialize: function(){
_.bindAll(this);
this.model.on('change', this.render, this);
},
// Re-renders the era item to the current state of the model and
// updates the reference to the era's edit input within the view
render: function(){
this.$el.html( this.template(this.model.attributes));
this.$era_start = this.$('.era-start');
this.$era_end = this.$('.era-end');
this.$era_start.attr('disabled', true);
this.$era_end.attr('disabled', true);
return this;
},
// Switch this view into editing mode, displaying the input field
edit: function(){
this.$('.edit-input').removeAttr('disabled');
this.$el.addClass('editing');
this.$('.edit-input').addClass('editing');
},
// Close the editing mode, saving changes to the era
close: function(){
this.$('.edit-input').attr('disabled', true);
var start = this.$era_start.val().trim();
var end = this.$era_end.val().trim();
if(start && end){
this.model.save({from: start, until: end});
}
this.$el.removeClass('editing');
this.$('.edit-input').removeClass('editing');
this.trigger('close');
},
updateOnEnter: function(e){
if(e.which !== ENTER_KEY && (!this.$era_start.val().trim() || !this.$era_end.val().trim())){
return;
}
this.close();
}
});
这是era模型的代码:
var karass = karass || {};
karass.Era = Backbone.Model.extend({
defaults: {
from: '',
until: ''
},
});
我想在使用localStorage时不需要url
编辑:我忘了提到,虽然这种行为发生在Era/EraView本身,但它也发生在扩展Era的名称模型中。名称依次属于名称集合。我不知道这是否有什么不同,但我想我应该加上它
编辑2:名称集合如下所示:
karass.Names = History.extend({
model: karass.Name,
localStorage: new Backbone.LocalStorage('karass-names'),
});
编辑3:我在JSFIDLE上发布了所有代码:使用localStorage时不需要url。但您需要在模型或集合上设置
localStorage
属性(如果在集合上设置localStorage
,则集合中的模型将“继承”此设置):
如果不设置
localStorage
属性,插件将返回默认的ajax同步,因此会出现uri丢失异常。使用localStorage时不需要url。但您需要在模型或集合上设置localStorage
属性(如果在集合上设置localStorage
,则集合中的模型将“继承”此设置):
如果不设置
localStorage
属性,插件将返回默认的ajax同步,因此您将获得缺少uri的异常。是的,这样做了。(也应该发布名称集合代码)等等,era不是集合。它是一个按名称扩展的模型,该名称依次进入名称集合。此名称集合已定义localStorage属性。抱歉,我不知道您的扩展内容的类别以及属于哪个集合。。。从异常消息中可以看出,EraView
中的this.model
中的对象没有localStorage
属性,也不属于具有localStorage
属性的集合。您应该仔细检查您的所有集合是否具有localStorage
,并且仅当您将模型传递给集合中该模型所在的视图时,您才可以这样做。否则,您需要发布完整的模型/集合层次结构,以及您作为模型传递给EraView的内容…Era扩展模型;名称延续时代;名称:名称的集合,具有localStorage属性;你是说每个模型都必须属于一个集合?EraView中的this.model基本上是一个名称对象,它属于一个具有localStorage属性的集合。是的,就是这样做的。(也应该发布名称集合代码)等等,era不是集合。它是一个按名称扩展的模型,该名称依次进入名称集合。此名称集合已定义localStorage属性。抱歉,我不知道您的扩展内容的类别以及属于哪个集合。。。从异常消息中可以看出,EraView
中的this.model
中的对象没有localStorage
属性,也不属于具有localStorage
属性的集合。您应该仔细检查您的所有集合是否具有localStorage
,并且仅当您将模型传递给集合中该模型所在的视图时,您才可以这样做。否则,您需要发布完整的模型/集合层次结构,以及您作为模型传递给EraView的内容…Era扩展模型;名称延续时代;名称:名称的集合,具有localStorage属性;你是说每个模型都必须属于一个集合?EraView中的this.model基本上是一个名称对象,它属于具有localStorage属性的集合。
karass.Era = Backbone.Model.extend({
localStorage: new Backbone.LocalStorage("EraCollection"),
// the EraCollection should be an unique name within your app.
defaults: {
from: '',
until: ''
},
});