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 回答