2013-03-29 2 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? 
} 

Поскольку это не имеет смысла, чтобы загрузить все файлы в каталог и отправить его обратно клиенту, что я сделал, я создал модель на сервере и заполнил modifiedDate и path, оставив content до null. Но проблема теперь в том, что как я могу заполнить content, когда пользователь нажимает на файл? Я не уверен, как вручную отправлять HTTP-запрос с Backbone View или контроллера. Или есть лучший способ сделать это? Один из способов, о котором я могу думать, - создать еще одну модель, которая поддерживает только modifiedDate и path, но для меня это выглядит очень много и многократно.

ответ

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 
}); 

Это может работать без кода, кроме того, что вы показали. Поскольку URL-адрес, используемый моделью для извлечения, создается по умолчанию, добавляя идентификатор модели к концу URL-адреса его коллекции.

Так что с вашего сервера, вы возвращаете массив JSON из '/ API/файлов': [{id:1, path:'foo'}, {id:2, path:'bar'}]

Тогда из '/ API/файлы/1': {id:1, path:'foo', content:'whatever'}

+0

удивительных. Я не знал, что вы можете вызвать fetch() из модели. Должно быть, пропустили его, читая api. Благодаря! – GantengX

1

Когда пользователь нажимает на файл, вы можете вызвать метод базовой линии fetch на модели. Затем ваша модель будет заполнена данными с сервера.

Обратите внимание, что для того, чтобы это работало, вы должны сначала вернуть коллекцию с сервера, где модели, по крайней мере, имеют идентификаторы. Каждое другое поле будет заполнено после вызова fetch. Кроме того, вы должны переопределить model url, если он отличается от стандартного (collection/id).