2012-02-28 27 views
3

我只是嘗試使用todo示例對我的項目採用backbone.js。在我的app.js文件中,我嘗試實例化我的視圖/模型/集合等,但我嘗試去獲取錯誤消息:應用程序未在TodoList中定義。不同文件中的模型/視圖

HTML:

<head> 

<script type="text/javascript" src="js/json2.js"></script> 
<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script> 
<script type="text/javascript" src="js/underscore-min.js"></script> 
<script type="text/javascript" src="js/backbone-min.js"></script> 
<script type="text/javascript" src="js/backbone-localstorage.js"></script> 

<script type="text/javascript" src="js/models/models.js"></script> 
<script type="text/javascript" src="js/collections/collections.js"></script> 
<script type="text/javascript" src="js/views/views.js"></script> 
<script type="text/javascript" src="js/views/app.js"></script> 

<script type="text/javascript" src="js/app.js"></script> 

app.js(根爲我的應用):

var app = { 
    models:{}, 
    collections:{}, 
    views:{} 
}; 

    jQuery(function($) { 

     var Todos = new app.collections.TodoList; 
     var test = new Todo; 
     var test2 = new TodoView; 
     var appView = new AppView({}); 

    }); 

collections.js:

app.collections.TodoList = Backbone.Collection.extend({ 

model: Todo, 

localStorage: new Store("todos"), 

done: function() { 
    return this.filter(function(todo) { 
     return todo.get('done'); 
    }); 
}, 

remaining: function() { 
    return this.without.apply(this, this.done()); 
}, 
nextOrder: function() { 
    if (!this.length) return 1; 
    return this.last().get('order') + 1; 
}, 

comparator: function(todo) { 
    return todo.get('order'); 
} 

});

回答

5

您正在嘗試在準備好之前使用名稱空間。兩個選項。首先,先'app.js',但取出初始化代碼並將其放入絕對最後加載的'bootstrap.js'中。第二種選擇,以及我通常喜歡的選項,如果它們不在那裏,則在文件中定義您需要的命名空間。例如

var app = app || {}; 
app.collection = app.collection || {}; 

基本上,代碼是一個接一個加載的。當你說namespace.subspace時,代碼期望這個名稱空間已經被定義爲某些東西 - 通常是我見過的大多數情況下的一個對象。如果沒有這個基礎代碼,代碼就會變得扁平化 - 它會假設你正在試圖從屋頂開始建造一座城堡。

相關問題