Используя одну автоформу, мне нужно вставить данные в две коллекции - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я работаю над системой инвентаризации, которая использует Коллекцию деталей и Коллекцию закупок в качестве основы приложения. У каждой части есть соответствующая покупка. IE часть должна иметь идентификатор, серийный номер и номер стоимости, связанный с ним. Я использую Meteor. js с coffeescrip, jade и Graphr. Я могу вставить в каждую коллекцию индивидуально, но они не кажутся связанными. Я установил линкеры между этими двумя соединениями, но я немного растерялся относительно того, куда go следующий

вот фрагмент коллекции

Коллекция покупок

    PurchaseInventory.schema = new SimpleSchema
        partId:
            type:String
            optional:true

        serialNum:
            type:Number
            optional:true

        costNum:
            type:Number
            optional:true

Коллекция деталей / схема


    Inventory.schema = new SimpleSchema

        name:
            type:String
            optional:true

        manufacturer:
            type:String
            optional:true

        description:
            type:String
            optional:true

запрос деталей


    export getInventory = Inventory.createQuery('getInventory',
        $filter: ({ filters, options, params }) ->
                if params.filters then Object.assign(filters, params.filters)
                if params.options then Object.assign(options, params.options)
                return { filters, options , params }
        name:1
        manufacturer:1
        description:1
        pic:1
        purchase:
            partId:1

    )

запрос на покупку


    export getPurchase = PurchaseInventory.createQuery('getPurchase',
        $filter: ({ filters, options, params }) ->
                if params.filters then Object.assign(filters, params.filters)
                if params.options then Object.assign(options, params.options)
                return { filters, options , params }
        serial:1
        cost:1
        date:1
        warrentyDate:1
        userId:1
        )

Линкеры

//Parts
    Inventory.addLinks
        purchase:
            collection:PurchaseInventory
            inversedBy:"part"


    //purchases
    PurchaseInventory.addLinks
        part:
            type:'one'
            collection:Inventory
            field:'partId'
            index: true

И, наконец, автоформа Jade / Pug


    +autoForm(class="inventoryForm" schema=schema  id="inventoryInsertForm" validation="blur" type="method" meteormethod="inventory.insert")
        .formGroup
          +afQuickField(name="name" label="Name")
          +afQuickField(name="manufacturer" label="Manufacturer")
          +afQuickField(name="description" label="Description")
          button#invenSub(type="submit") Submit

Повторяю, моя цель состоит в том, чтобы каждый элемент по частям имел ссылку на соответствующие данные покупки.

1 Ответ

1 голос
/ 05 февраля 2020

Самый простой способ - использовать тип формы автоформы normal и создать пользовательский обработчик события для события отправки (в качестве альтернативы вы можете использовать ловушки AutoForm onSubmit). Оттуда вы можете использовать AutoForm.getFormValues API-функцию для получения текущего документа.

Так как я не в Coffeescript, я предоставил бы следующий код Blaze / JS, но я думаю, это должно дать вам идею:

{{# autoForm type="normal" class="class="inventoryForm" schema=schema  id="inventoryInsertForm" validation="blur"" schema=schema  id="insertForm" validation="blur" }}
  <!-- your fields -->
{{/autoForm}}
/**
 * validates a form against a given schema and returns the
 * related document including all form data.
 * See: https://github.com/aldeed/meteor-autoform#sticky-validation-errors
 **/
export const formIsValid = function formIsValid (formId, schema) {
  const { insertDoc } = AutoForm.getFormValues(formId)
  // create validation context
  const context = schema.newContext()
  context.validate(insertDoc, options)

  // get possible validation errors
  // and attach them directly to the form
  const errors = context.validationErrors()
  if (errors && errors.length > 0) {
    errors.forEach(err => AutoForm.addStickyValidationError(formId, err.key, err.type, err.value))
    return null
  } else {
    return insertDoc
  }
}
Template.yourFormTempalte.events({
  'submit #insertForm' (event) {
    event.preventDefault() // important to prevent from reloading the page!


    // validate aginst both schemas to raise validation
    // errors for both instead of only one of them
    const insertDoc = formIsValid('insertForm', PurchaseInventory.schema) && formIsValid('insertForm', Inventory.schema)

    // call insert method if both validations passed
    Meteor.call('inventory.insert', insertDoc, (err, res) => { ... })
    Meteor.call('purchaseInventory.insert', insertDoc, (err, res) => { ... })
  }
})

Обратите внимание, что если вам нужно, чтобы обе вставки были успешными на стороне сервера, вы должны написать третий метод Meteor, который явно вставляет одну сделать c в обеих коллекциях в одном вызове метода. Если у вас Mon go version> = 4, вы можете комбинировать это с транзакциями .

...