2013-03-29 197 views
0

JavaScript的相當新,所以它可能是一個noobish問題。JavaScript骨幹模型設計

在我的項目中,我爲我的服務器使用了NodeJS,客戶端使用了Backbone。客戶端將向服務器發送請求,服務器將發送服務器中的文件列表,我的目標是簡單地返回文件列表,當用戶單擊該文件時,它會向服務器發送另一個請求以加載文件。

目前在客戶端級別我的模型和收集的定義是這樣的:

app.MyFile = Backbone.Model.extend({ 
    defaults: { 
     modifiedDate: new Date(), 
     path: '', 
     content: '' // content of the file 
    } 
}); 

var MyFileList = Backbone.Collection.extend({ 
    model: app.MyFile, 
    url: '/api/files' 
}); 

// create global collection of files 
app.MyFiles = new MyFileList(); 

app.AppView = Backbone.View.extend({ 
    initialize: function() { 
    // fetch all files 
    app.MyFileList.fetch(); 
    } 
}); 

// app.js (point of entry) 
$(function() { 
    // Kick things off by creating the **App**. 
    new app.AppView(); 
}); 

而我的服務器代碼:

var application_root = __dirname, 
    express = require("express"), 

... 
app.get('/api/files', function(req, res) { 
    ... 
    // return file list 
} 

app.get('/api/files/:id', function(req, res) { 
    ... 
    // return file content? 
} 

既然沒有意義加載中的所有文件目錄並將其發送回客戶端,我所做的是我在服務器中創建了模型,並填寫了modifiedDatepath,同時將content更改爲null。但現在的問題是,如何在用戶點擊文件時填寫content?我不確定如何手動發送來自Backbone View或控制器的HTTP請求。或者有沒有更好的方法來做到這一點?我能想到的一種方式是創建另一個只保留modifiedDatepath的模型,但對我來說這看起來非常冗長和重複。

回答

2

鑑於你在客戶端有什麼,你可能不需要更多。

app.MyFiles = new MyFileList(); 

app.MyFiles.fetch().done(function() { 
    // your collection is fetched but each model's content is empty. 
    // now, I assume at this point you will show them in some view/views. 
}); 

現在,當點擊其中的一件事情,你可以獲取內容。

var model = app.MyFiles.get(id); 
model.fetch().done(function() { 
    // now the model's content attribute will be set 
}); 

這可能不會比你顯示的代碼更多的代碼。由於默認情況下通過將模型的ID附加到其集合的url的末尾來創建模型用來提取的url。

所以從你的服務器,你回來從'/ API /文件的JSON數組:[{id:1, path:'foo'}, {id:2, path:'bar'}]

然後從 '/ API /文件/ 1':{id:1, path:'foo', content:'whatever'}

+0

真棒。我不知道你可以從模型中調用fetch()。閱讀api時一定錯過了它。謝謝! – GantengX

1

當用戶點擊文件時,您可以在模型上調用骨幹的fetch方法。然後你的模型將充滿來自服務器的數據。

請注意,爲了這個工作,你應該首先從服務器返回集合,其中模型至少有id。在fetch電話後,其他所有字段將被填寫。此外,如果它不同於標準(它是collection/id),則應該覆蓋model url