Javascript 主干视图表示模型未定义?
我试图用脊梁弄湿我的脚,但我不知道这里出了什么问题:Javascript 主干视图表示模型未定义?,javascript,backbone.js,backbone-views,backbone-model,Javascript,Backbone.js,Backbone Views,Backbone Model,我试图用脊梁弄湿我的脚,但我不知道这里出了什么问题: var ToDoApp = { model: Backbone.Model.extend({ default:function(){ return { task: '', completed:false }
var ToDoApp = {
model: Backbone.Model.extend({
default:function(){
return {
task: '',
completed:false
}
}
}),
collection: Backbone.Collection.extend({
model: this.model
}),
view: Backbone.View.extend({
model: new this.model(),
tagName: 'li'
})
}
console.log(new ToDoApp.model());
我在视图的模型上得到一个“未定义的不是函数”。发生了什么事?此外,视图是否需要有一个模型?抱歉,如果这是一个非常基本的问题,我仍然不完全理解主干网是如何工作的。这部分:
collection: Backbone.Collection.extend({
model: this.model
})
将在您构建ToDoApp
时执行,但this
此时不会ToDoApp
,this
可能会是window
并且window
不会有model
属性。结果是你实际上在说:
collection: Backbone.Collection.extend({
model: undefined
})
类似的问题也发生在这里:
view: Backbone.View.extend({
model: new this.model(),
tagName: 'li'
})
最简单的方法是逐件构建ToDoApp
var ToDoApp = { };
ToDoApp.model = Backbone.Model.extend({ ... });
ToDoApp.collection = Backbone.Collection.extend({
model: ToDoApp.model
});
ToDoApp.view = Backbone.View.extend({
tagName: 'li'
});
然后在创建视图实例时为视图实例创建模型:
var model = new ToDoApp.model();
var view = new ToDoApp.view({ model: model });
此外,对于您的“类”,使用诸如ToDoApp.Model
、ToDoApp.Collection
和ToDoApp.View
之类的名称更为常见。此部分:
collection: Backbone.Collection.extend({
model: this.model
})
将在您构建ToDoApp
时执行,但this
此时不会ToDoApp
,this
可能会是window
并且window
不会有model
属性。结果是你实际上在说:
collection: Backbone.Collection.extend({
model: undefined
})
类似的问题也发生在这里:
view: Backbone.View.extend({
model: new this.model(),
tagName: 'li'
})
最简单的方法是逐件构建ToDoApp
var ToDoApp = { };
ToDoApp.model = Backbone.Model.extend({ ... });
ToDoApp.collection = Backbone.Collection.extend({
model: ToDoApp.model
});
ToDoApp.view = Backbone.View.extend({
tagName: 'li'
});
然后在创建视图实例时为视图实例创建模型:
var model = new ToDoApp.model();
var view = new ToDoApp.view({ model: model });
此外,使用诸如
ToDoApp.Model
、ToDoApp.Collection
和ToDoApp.View
之类的名称对于您的“类”来说更为常见。啊,好吧,那么将所有内容都包含在一条语句中是个坏主意吗?我想尝试在不超出第一个对象声明的情况下创建应用程序。您面临的具体问题是ToDoApp.model
和this
在您认为应该的时候不是ToDoApp
。您可以将model=Backbone.model.extend(…)
内容移动到ToDoApp
声明之外,但这只是隐藏了问题。下面是我的想法:您对此有何看法?在现实世界中使用这是一个好主意吗?为什么必须在一个声明中使用?我倾向于将每一部分放在一个单独的文件中,让我的部署系统将它们混合在一起。您还创建了三个意外全局变量,假设加载JavaScript时,#todo container
将在DOM中,您的viewAll
应该使用this.collection
而不是this.model
,您可以说this.collection.each(…)
而不是.each(this.collection.toArray(),…)
。你至少应该熟悉一下。啊,好吧,那么把所有的东西都包含在那一句话里是个坏主意?我想尝试在不超出第一个对象声明的情况下创建应用程序。您面临的具体问题是ToDoApp.model
和this
在您认为应该的时候不是ToDoApp
。您可以将model=Backbone.model.extend(…)
内容移动到ToDoApp
声明之外,但这只是隐藏了问题。下面是我的想法:您对此有何看法?在现实世界中使用这是一个好主意吗?为什么必须在一个声明中使用?我倾向于将每一部分放在一个单独的文件中,让我的部署系统将它们混合在一起。您还创建了三个意外全局变量,假设加载JavaScript时,#todo container
将在DOM中,您的viewAll
应该使用this.collection
而不是this.model
,您可以说this.collection.each(…)
而不是.each(this.collection.toArray(),…)
。你至少应该熟悉你自己。