Mongoose/Express を使用した Backbone.js。
サーバー上のデータベースとモデルと通信する方法を理解するのに最も苦労しています。正直、モデルとサーバーの関係がよくわかりません。クライアント上のモデルはサーバー上のモデルと同期していますか? サーバー上にモデルさえありますか?現在、MongoDB にはデータが取り込まれており、私がやろうとしているのは、fetch() を機能させることだけです。どんな助けでも素晴らしいでしょう。バックボーンがすでにこれをすべて行っている場合、RESTful 呼び出しの使用を避けようとしています。
// CLIENT
// Lobby.js
(function($){
var socket = io.connect('http://localhost:3000');
var App = Backbone.Router.extend({
routes: {
'': 'lobby'
},
lobby: function () {
var collection = new Collection();
var listView = new MatchListView(collection);
collection.fetch();
collection.fetch({success: function(){
console.log("Fetch Success"); // => 2 (collection have been populated)
}});
}
});
var Model = Backbone.Model.extend();
/**
* Collection - bound to the server
* matchListView is listening for event changes
*/
var Collection = Backbone.Collection.extend({
url: 'lobby',
socket:socket,
model: Model,
initialize: function(Collection){
_.bindAll(this, 'addOne', 'removeOne', 'removeOne');
this.ioBind('createMatch', this.addOne, this);
this.ioBind('removeMatch', this.removeOne, this);
},
addOne: function(data) {
this.add({id:data._id});
},
removeOne: function(data) {
console.log('remove match ' + data._id);
this.remove({id:data._id});
}
});
/**
* View - bount to collection
* listening for changes to collection 'add' and 'remove'
*/
var MatchListView = Backbone.View.extend({
el: $('body'),
urlRoot: 'lobby',
socket:socket,
events: {
'click #create': 'createMatch'
},
initialize: function(Collection){
_.bindAll(this, 'render', 'renderCollection','addOne', 'removeOne', 'createMatch');
this.collectionView = Collection;
this.collectionView.bind('add', this.addOne);
this.collectionView.bind('remove', this.removeOne);
this._viewPointers = {}; // make sure we're starting over
this.render();
},
render: function(){
...
}
});
$(document).ready(function ()
{
// create a new app and trigger the router.
window.app = new App();
Backbone.history.start();
});
})(jQuery);
上記のページは /lobby にあります。サーバー上の mongoDB とそのスキーマは /mongo にあります
//SERVER
// Mongo.js
/**
* Mongol Database
*/
var mongoose = require('mongoose');
var db = mongoose.createConnection('mongodb://localhost:27017/test');
//var db = mongoose.createConnection('mongodb://nodejitsu_cpiv:es7te3ognihsibnii3a7ekdfu3@ds043927.mongolab.com:43927/nodejitsu_cpiv_nodejitsudb7525674102');
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback ()
{
console.log("connected to database tester");
});
/* ====================
// Lobby
// =================== */
var schema = mongoose.Schema,
ObjectId = schema.ObjectId;
var lobbySchema = new schema({
status:Number,
sockets: [{ id:String, team:Number}],
player1:{id:Number},
player2:{id:Number}
});
// Collection
var Lobby = db.model('lobby', lobbySchema);