2015-04-15 1 views
2

У меня возникли проблемы с добавлением новых значений вложенных/массив в коллекцию с помощью autoForm.Быстрое преобразование/форматирование вложенного массива объектов

Я пытаюсь использовать quickForm для обновления вопросов. Я хочу, чтобы пользователь мог добавлять дополнительные варианты ответа. Моя схема выглядит следующим образом (упрощенно опустить порядок, метаданные и т.д.):

questionSchema = new SimpleSchema({ 
    label: { 
    type: String 
    }, 
    answers: { 
    type: Array, 
    minCount: 2, 
    maxCount: 6 
    }, 
    "answers.$": { 
    type: Object 
    }, 
    "answers.$._id": { 
    type: String, 
    regEx: SimpleSchema.RegEx.Id, 
    autoValue: function(){ return Random.id(); }, 
    autoform: { 
     type: "hidden" 
    } 
    }, 
    "answers.$.label": { 
    type: String, 
    regEx: /.{1,150}/, 
    autoform: { 
     label: false 
    } 
    }, 
    "answers.$.count": { 
    type: Number, 
    defaultValue: 0, 
    autoform: { 
     type: "hidden" 
    } 
    } 
}); 

Другой чем answers.$.label, я не использовал никаких autoform варианты, когда я только добавляющие вопросы через QuickForm type='insert'. Я добавил эти параметры, когда я хотел редактировать вопросы, потому что в противном случае у меня появилась жалоба, что я оставил count null. Поэтому я заставил их спрятаться, но пусть они будут в форме.

Моя форма редактирования выглядит следующим образом:

{{> quickForm collection="Questions" id="editQuestionForm" 
    type="update" setArrayItems="true" doc=questionToEdit 
    fields="label, answers"}} 

Я в настоящее время в состоянии обновить метки на мой вопрос и ответы, которые я сначала добавил. Но я не могу добавить новые варианты ответов. Когда я это делаю, это отрицается, потому что count не является обязательным. Но я указан defaultValue ...

Я предпочел бы мой QuickForm выглядеть так, что я не помещая count с или _id сек, где пользователь может изменить их:

{{> quickForm collection="Questions" id="editQuestionForm" 
    type="update" setArrayItems="true" doc=questionToEdit 
    fields="label, answers, answers.$.label"}} 

Но, может быть, я нужно сохранить answers.$._id и скрывать, чтобы мои изменения обновили правильные ответы?

Итак:

  1. Мой отсчеты ответ по умолчанию 0 на вставке, так почему же не то, что произойдет, когда я редактировать и добавлять ответы?

  2. Может ли autoForm сделать upsert вместо обновления? Вставьте новые вопросы, обновите существующие метки вопросов, используйте defaultalue или autoValue при необходимости.

  3. Должен ли я использовать метод для этого типа вещей?

+0

Есть несколько возможностей. Первое, что я хочу знать, это то, что вы делаете со свойством count? Предполагается ли он увеличиваться для каждого нового добавления (чтобы вы могли, например, индексировать этот произвольный начальный порядок)? --BUT: это может быть так же просто, как ответы 'omitFields =" '. $ ._ id', 'отвечает. $. Count' "' вместо свойства 'fields' – pfkurtz

+0

Свойство count только обновляется клиентским устройством поэтому я просто хочу, чтобы он начинался с 0, если я добавляю ответы. Если я добавлю «omitFields», я все равно получаю «Count is required» для начальных ответов, когда я пытаюсь обновить вопрос. – roblingle

+0

Кроме того, я только разрешаю пользователям обновлять вопросы, на которых есть счетчик ответов 0 по всей доске, поэтому я рассмотрел использование крючка перед обновлением, чтобы убедиться, что все значения равны 0, и оставьте _id в форме и скрыты. – roblingle

ответ

2

EDIT: Я обновил пример и развертывание тестового приложения к metoer на http://test-questions.meteor.com/. Его немного грубо по краям (честно говоря, это ничего, но полезно), но он должен показывать функциональность в действии. Используйте ссылку добавления нового вопроса внизу. Существующие вопросы должны отображаться внизу формы addquestion. Нажмите на существующий вопрос, чтобы отредактировать его. В целом, функциональность есть. Просто не ненавидишь меня за плохой дизайн. Винить богиню времени.


Способ, которым я обычно занимаюсь встраиваемыми документами, заключается в разделении каждого вспомогательного объекта на отдельную схему. Это позволяет коду быть аккуратным и понятным, а также избегать типичных ловушек.

Здесь образец проекта, демонстрирующий нижнюю shema в действии.Просто мерзавец тянуть и метеор пробег: https://github.com/nanlab/question


новая ссылка http://app-bj9coxfk.meteorpad.com/

Код: http://meteorpad.com/pad/7fAH5RCrSdwTiugmc/


question.js:

Questions = new Mongo.Collection("questions"); 

SimpleSchema.answerSchema = new SimpleSchema({ 
    _id: { 
     type: String, 
     regEx: SimpleSchema.RegEx.Id, 
     autoValue: function() { 
      return Random.id(); 
     }, 
     autoform: { 
      type: "hidden" 
     } 
    }, 
    label: { 
     type: String, 
     regEx: /.{1,150}/, 
     autoform: { 
      label: false 
     } 
    }, 
    count: { 
     type: Number, 
     autoValue: function() { 
      return 0; 
     }, 
    } 
}) 

Questions.attachSchema(new SimpleSchema({ 
    label: { 
     type: String 
    }, 
    answers: { 
     type: [SimpleSchema.answerSchema], 
     minCount: 2, 
     maxCount: 6 
    }, 
})) 


Questions.allow({ 
    insert: function(){return true;}, 
    update: function(){return true;}, 
}) 


if(Meteor.isServer) { 
    Meteor.publish("questions", function() { 
     return Questions.find(); 
    }) 
} else { 
    Meteor.subscribe("questions"); 
} 
+0

Спасибо, Аднан, я не знал, что вы можете прикрепить схему к массиву, чтобы это было действительно полезно. ** Но ** Я не уверен, что это помогает, честно говоря. Используя ваш пример кода, я не смог вставить вопросы, и моя настоящая проблема - в формах _update_. Мои формы _insert_ работают нормально, и хотя мне нравится, что это немного более аккуратно, я не думаю, что это функционально отличается от того, что у меня есть сейчас. – roblingle

+0

обновлен пример. Либо тянуть, либо использовать http://test-questions.meteor.com/ –

+1

Спасибо, что работает. Итак, ключевой вынос здесь: используйте 'autoValue', а не' defaultValue' для объектов в массиве. AutoValues ​​будет там уважаться, но defaultValues ​​- нет. – roblingle