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(),…)
。你至少应该熟悉你自己。