0

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?
}

ディレクトリ内のすべてのファイルをロードしてクライアントに送り返すのは意味がないので、私がしたことは、サーバーでモデルを作成し、いっぱいmodifiedDatepathcontentnull. contentしかし、問題は、ユーザーがファイルをクリックしたときにどのように入力するかということです。バックボーン ビューまたはコントローラーから手動で HTTP 要求を送信する方法がわかりません。または、これを行うより良い方法はありますか?私が考えることができる1つの方法は、保持するだけの別のモデルを作成することmodifiedDateですpathが、私にはこれは非常に冗長で反復的に見えます.

4

2 に答える 2

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 の末尾にモデルの ID を追加することによってデフォルトで作成されるためです。

したがって、サーバーから、「/api/files」から json 配列を返します。[{id:1, path:'foo'}, {id:2, path:'bar'}]

次に、「/api/files/1」から:{id:1, path:'foo', content:'whatever'}

于 2013-03-29T06:41:41.293 に答える
1

fetchユーザーがファイルをクリックすると、モデルでバックボーンのメソッドを呼び出すことができます。次に、モデルにサーバーからのデータが入力されます。

これを機能させるには、最初にサーバーからコレクションを返す必要があることに注意してください。モデルには少なくとも id があります。他のすべてのフィールドは、fetch呼び出し後に入力されます。また、モデル urlが標準 (つまり ) と異なる場合は、オーバーライドする必要がありますcollection/id

于 2013-03-29T06:41:30.477 に答える