1

私は最初のプログラムをracerで書きました。「col.doc.prop」パスに手動でバインドされた単純なテキスト ボックスが表示されます。値を変更すると、サーバーのストアには適用されません。サブスクライブしたモデルがサーバーと同期しない原因は何ですか?

サーバーコード:

var fs = require('fs');
var io = require('socket.io');
var racer = require('racer');

var mongo = require('racer-db-mongo');
racer.use(mongo);

racer.js({
    entry: __dirname + '/client.js'
}, function(err, js) {
    return fs.writeFileSync(__dirname + '/script.js', js);
});

var express = require('express');
var server = express.createServer();
server.use(express.static(__dirname));

server.get('/', function(req, res)
{
    var model = store.createModel();
    model.subscribe('col.doc', function(err, doc)
    {
        var prop = doc.get('prop');
        if (!prop)
        {
            doc.set('prop', 123);
            store.flush();
        }

        model.ref('_doc', doc);

        model.bundle(function(bundle)
        {
            var client = require('fs').readFileSync('./client.html', 'utf-8');
            client = client.replace('_init_', bundle.toString());
            res.send(client);
        });
    });
});

var store = racer.createStore(
{
    listen: server,
    db:
    {
        type: 'Mongo',
        uri: 'mongodb://localhost/racerdb'
    }
});
store.set('col.doc.prop', 123);
store.flush();

server.listen(3001);

クライアントコード:

useRacer = function()
{
    var socket = io.connect('http://localhost:3001');

    var racer = require('racer');

    process.nextTick(function() {
        racer.init(this.init, socket);
        return delete this.init;
    });

    racer.on('ready', function(model)
    {
        addListener = document.addEventListener ? function(el, type, listener) {
            return el.addEventListener(type, listener, false);
        } : function(el, type, listener) {
            return el.attachEvent('on' + type, function(e) {
                return listener(e || event);
            });
        };

        var element = document.getElementById('prop');
        var listener = function()
        {
            var val = element.value;
            model.set('col.doc.prop', val);
        };
        addListener(element, 'keyup', listener);

        var upgrade = function(id, value)
        {
            if (model.connected)
            {
                var prop = model.get('col.doc.prop');
                element.value = prop;
            }
            else
                model.socket.socket.connect();
        };

        model.on('connectionStatus', upgrade);
        model.on('set', 'con.*', upgrade);
    });
};
4

1 に答える 1

2

クライアントコードのいくつかの行を変更することで解決された問題:

  • model.set('col.doc.prop', val) ==> model.set('_doc.prop', val)
  • model.get('col.doc.prop') ==> model.get('_doc.prop')
  • model.on('set', 'con. ', upgrade) ==> model.on('set', ' ', upgrade)
于 2012-06-21T14:11:02.643 に答える