将输入数据转换为骨干模型上的数组?

时间:2014-03-20 22:43:20

标签: javascript mongodb backbone.js

使用mongodb和骨干模型我试图将输入值存储为模型中的数组?

所以在准系统中,让我说我有一个小小的形式。

<form id="send-message">
  <input name="message" class="message"/>
  <button type="submit" class="send">Send</button>
</form>

然后在我的包含此表单的视图的骨干代码中,我提交了这些数据。我正在使用socket.io所以我有一些像这样的代码。我不认为发布此视图的完整代码是必要的,但我希望这可以防止混淆。

var Marionette = require('backbone.marionette'),
    MessagesView = require('./messages'),
    UsersListView = require('./users_list'),
    socket = io.connect();

module.exports = ChatView = Marionette.ItemView.extend({
    template: require('../../templates/chat.hbs'),
    events: {
        'submit #send-message': 'sendMessage'
    },

    initialize: function() {
        var self = this;
        this.messagesView = new MessagesView({ collection: window.App.data.messages });
        this.usersListView = new UsersListView({ collection: window.App.data.messages });
        socket.on('new message', function(data) {
            self.createMessage(data);
        });
    },

    onRender: function() {
        this.messagesView.render().$el.appendTo(this.$el.find('.message-content'));
        this.usersListView.render().$el.appendTo(this.$el.find('.users-list'));
    },

    sendMessage: function(e) {
        e.preventDefault();

        var $message = this.$el.find('input.message');
        socket.emit('send message', $message.val());

        $message.val('');
    },

    createMessage: function(data) { 

        var model = window.App.data.messages.where({username: data.username});

        _.each(model, function(model) {
            var values = {
                message: data.message
            }
            model.save(values);
        });

        window.App.core.vent.trigger('app:log', 'Add View: Created a new message!');
    }

});

总而言之,这只是将输入数据提交给节点服务器,然后服务器发出响应并触发createMessage

我的问题是我想捕获所有这些消息并将它们作为数组存储在模型中。所以数据结构看起来就像这样。

// This represents the ideal structure of the model at barebones   
var user = {
    username: 'Grant',
    message: {message1: "Hey guys", message2: "Michigan State will win the tourney"}
}

让我们仔细看看createMessage方法..你看我保存了如下所示的消息,但我不确定如何获取已保存在该模型上的消息然后附加一条新消息,从而创建一个阵列。我会像现在一样离开它,但我尝试使用.push()函数并尝试各种方法都失败了......

createMessage: function(data) { 

    var model = window.App.data.messages.where({username: data.username});

    _.each(model, function(model) {
        var values = {
            message: data.message
        }
        model.save(values);
    });

    window.App.core.vent.trigger('app:log', 'Add View: Created a new message!');
}

数据转到mongodb所以我也有一个控制器处理和(我认为)覆盖了backbone.sync,但是当发出PUT请求时,路由器会触发控制器app.put('/api/messages/:id', messages.update);然后{{1方法处理数据,所以我可以在这里创建数组。

update

编辑:考虑到这一点,我确实希望生成一个对象数组。我最大的问题是找出如何附加新对象并生成新密钥?

例如

update: function(req, res) {
    models.Message.update({ _id: req.params.id }, {message: req.body.message //Somewhere here I could append?}, function(err, message) {
        if (err) {
          res.json({error: 'Update failed.'});
        } else {
          res.json(message);
        }
    });
}

用户提交新消息,如何使用新密钥创建对象,我尝试使用骨干来获取对象的var user = { username: 'Grant', message: {message1: "Hey guys"} } ,但这有点毛茸茸,因为现在这主要是基于香草的..

1 个答案:

答案 0 :(得分:1)

你想要做的是一个对象,而不是一个数组 - 这就是为什么.push()不起作用。


function(value) {
    user.message['message' + (Object.keys(user.message).length + 1)] = value;
}

这将为对象添加一个新值,其中包含“消息”键+ '消息量'。