2015-08-25 6 views
0

Как обновить значения внедренного объекта в документе mongoDB?Как проверить и обновить внедренный объект в документе коллекции mongoDB

{{service.id}} и {{service.username}} показывают правильные значения в шаблоне таблицы, но я не уверен, как их вызвать в функции saveItem(). Когда я попробую service.id, service.$.id и service.[0].id, я получаю Error: Unexpected token .. Когда я пробую "service.id", форма отправляется и ничего не происходит, когда я пытаюсь "service.[0].id", форма застряла при редактировании, и ничего не происходит, и когда я пытаюсь выполнить "service.$.id", я получаю сообщение об ошибке, когда поле $ не может быть обновлено.

Должен ли я иметь что-то еще в своем javascript-коде? Или я делаю что-то неправильно при определении схемы (т. Е. Не нужно знаков доллара).

Спасибо!

Вот мой код:

var Schemas = {}; 
 

 
Items = new Meteor.Collection('items'); 
 

 
Schemas.Items = new SimpleSchema({ 
 
    _id: { 
 
    type: String, 
 
    }, 
 
    name: { 
 
    type: String, 
 
    label: "Item Name", 
 
    min: 1 
 
    }, 
 
    "service.$": { 
 
    type: [Object] 
 
    }, 
 
    "service.$.id": { 
 
    type: Number 
 
    }, 
 
    "service.$.username": { 
 
    type: String 
 
    } 
 

 
}); 
 

 
Items.attachSchema(Schemas.Items); 
 

 

 

 
var saveItem = function() { 
 
    var editItem = { 
 
    _id: $('#editId').val(), 
 
    name: $('#editName').val(), 
 
    "service.$.id": $('#editServiceId').val(), //not working 
 
    "service.$.username": $('#editServiceUsername').val() //not working 
 
    } 
 
    
 
    Items.update(Session.get('editItemId'), {$set: editItem}, {validationContext: 'updateForm'}, function(error, result) { 
 
    if(!error){ 
 
     Session.set('editItemId', null); 
 
    } 
 
    }); 
 

 
} 
 

 
Template._editItemsItem.helpers({ 
 
    editing: function() { 
 
    \t return Session.equals("editItemId", this._id); 
 
    } 
 

 
}); 
 

 
Template._editItemsItem.events({ 
 
    'click .editItem': function() { 
 
    Items.simpleSchema().namedContext('updateForm').resetValidation(); 
 
    Items.simpleSchema().namedContext('insertForm').resetValidation(); 
 
    Session.set("editItemId", this._id); 
 
    }, 
 
    'click .cancelItemEdit': function() { 
 
    Items.simpleSchema().namedContext('updateForm').resetValidation(); 
 
    Items.simpleSchema().namedContext('insertForm').resetValidation(); 
 
    Session.set("editItemId", null); 
 
    }, 
 
    'click .saveItem': function() { 
 
    saveTeam(); 
 
    }, 
 
    'keypress input': function(e){ 
 
    if(e.keyCode === 13){ 
 
     saveItem(); 
 
    } 
 
    else if(e.keyCode === 27){ 
 
     Items.simpleSchema().namedContext('updateForm').resetValidation(); 
 
     Items.simpleSchema().namedContext('insertForm').resetValidation(); 
 
     Session.set("editItemId", null); 
 
    } 
 
    } 
 
}); 
 

 
Template._editItems.helpers({ 
 
    items: function() { 
 
    return Items.find(); 
 
    }, 
 
});
<template name="_editItems"> 
 
\t <table class="ui very compact selectable celled table"> 
 
\t <thead> 
 
\t  <tr> 
 
\t  \t <th>_id</th> 
 
\t  <th>Name</th> 
 
\t  <th>Service Name</th> 
 
\t  <th>Service Id</th> 
 
\t  <th>Edit</th> 
 
\t  </tr> 
 
\t </thead> 
 
\t <tbody> 
 
\t  {{#each items}} 
 
\t \t \t \t {{> _editItemsItem}} 
 
\t  {{/each}} 
 
\t </tbody> 
 
\t </table> 
 
</template> 
 

 
<template name="_editItemsItem"> 
 
\t {{#if editing}} \t 
 
\t \t <tr class="ui form"> 
 
\t \t \t <td><div class="ui small input"><input type="text" id="editId" value="{{_id}}"></div></td> 
 
\t \t \t <td><div class="ui small input"><input type="text" id="editName" value="{{name}}"></div></td> 
 
\t \t \t <td><div class="ui small input"><input type="text" id="editServiceUsername" value="{{service.username}}"></div></td> 
 
\t \t \t <td><div class="ui small input"><input type="text" id="editServiceId" value="{{service.id}}"></div></td> 
 
\t \t \t <td> 
 
\t \t \t \t <button class="saveItem ui small circular primary button "><i class="ui save icon"></i></button> 
 
\t \t \t \t <button class="cancelItemEdit ui small circular red button "><i class="ui cancel icon"></i></button> 
 
\t \t \t </td> 
 
\t \t </tr> 
 
\t {{else}} 
 
\t \t <tr> 
 
\t \t \t <td>{{_id}}</td> 
 
\t \t \t <td>{{name}}</td> 
 
\t \t \t <td>{{service.username}}</td> 
 
\t \t \t <td>{{service.id}}</td> 
 
\t \t \t <td> 
 
\t \t \t \t <button class="editItem ui small circular button"><i class="ui edit icon"></i></button> 
 
\t \t \t </td> 
 
\t \t </tr> 
 
\t {{/if}} 
 
</template>

+1

Где вы есть 'вар editItem = { _id: $ ('# editId ') .val(), имя: $ (' # editName '). val(), "service. $. id": $ (' # editServiceId '). val(), // не работает "сервис . $. username ": $ ('# editServiceUsername'). val() // не работает }' try вместо 'var editItem = { _id: $ ('# editId'). Val(), имя: $ ('# editName'). Val(), service: {id: $ ('# editServiceId'). Val(), username: $ ('# editServiceUsername'). val()} ' }' –

+0

@MichelFloyd не повезло с этим, к сожалению. Что-нибудь еще, что вы думаете, может сработать? – pingo

+0

Я исключил несколько полей в документе Item, которые не обновляются. Может ли это вызвать какую-то проблему? – pingo

ответ

0

Got к ответу с помощью @MichelFloyd.

Схема должна выглядеть следующим образом: (нет $ знаков)

"service.$": { 
    type: [Object] 
    }, 
    "service.$.userid": { 
    type: Number 
    }, 
    "service.$.username": { 
    type: String 
    } 

И тогда это будет работать:

var editItem = { 
    _id: $('#editId').val(), 
    name: $('#editName').val(), 
    "service.userid": $('#editServiceId').val(), 
    "service.username": $('#editServiceUsername').val() 
}