Пользовательский ввод Meteor JS Autoform - нет текущего представления

Я создаю свой собственный тип ввода для автоформы в метеоре js. Все работает как надо, но в консоли браузера появляется странная ошибка. Этот настраиваемый ввод представляет собой раскрывающийся список с несколькими флажками начальной загрузки с возможностью вложения в другие раскрывающиеся списки начальной загрузки. Ошибка возникает, когда вы проверяете любое поле внутри раскрывающегося списка.

Uncaught Error: There is no current view

Blaze._getCurrentView
Blaze.getView
AutoForm.templateInstanceForForm
_validateField
_.throttle.later

Вот мой файл кофе, используемый для пользовательского ввода.

AutoForm.addInputType "dropdownMultiCheckbox",
  template: "afDropdownMultiCheckbox"
  valueOut: () ->
    grabInput = $(@).children().children('input:checked')
    holder = []
    grabInput.each ->
      holder.push $(@).val()
    if $(grabInput[0]).hasClass('all-selector')
      holder.shift()
    holder

SimpleSchema.messages
  'atLeastOne': 'You need to select at least one field'

Template.afDropdownMultiCheckbox.helpers

  options: ->
    options = @.selectOptions
    options

  dsk: () ->
    @.atts["data-schema-key"]

Template.afDropdownMultiCheckbox.events
  'click div.dropdown-toggle': (event) ->
    $(event.target).siblings("ul.dropdown-menu").toggle()
  'click .all-selector': (event) ->
    if event.target.checked
      $(event.target).parent().siblings().children(".checkbox-options").prop('checked',true)
    else
      $(event.target).parent().siblings().children(".checkbox-options").prop('checked',false)
  'click .checkbox-options': (event,templateInstance) ->
    if !(event.target.checked)
      $(event.target).parent().siblings().children(".all-selector").prop('checked',false)
    if $(".check-onclick-#{@.class}:checked").length == $(".check-onclick-#{@.class}").length
      $("#checkbox-all-#{templateInstance.data.atts.id}").prop('checked',true)
  'click div.btn.btn-default.dropdown-toggle,ul,ul *': (event) ->
    event.stopPropagation()

Template.afDropdownMultiCheckbox.rendered = ->
  instanceOfTemplate = @
  $("*").on "click", (event) ->
    if !($(event.target)[0] == $(".class-#{instanceOfTemplate.data.atts.id}")[0] ||
       $(event.target)[0] == $("##{instanceOfTemplate.data.atts.id}")[0] ||
       $(event.target).hasClass("close-dropdown-multi"))
      $(".class-#{instanceOfTemplate.data.atts.id}").hide()

нефритовый файл ниже:

template(name="afDropdownMultiCheckbox")
  .dropdown
    .btn.btn-default.dropdown-toggle(type="button", id="{{atts.id}}", aria-expanded="false")
      | {{atts.buttonText}}
      span.caret
    ul.dropdown-menu(role="menu", aria-labelledby="{{atts.id}}",class="class-{{atts.id}}")
      form
        div(data-schema-key="{{dsk}}")
          if atts.allOption.presence
            li.close-dropdown-multi(role="presentation")
              input.all-selector.close-dropdown-multi(type="checkbox", value="{{atts.allOption.value}}", id="checkbox-all-{{atts.id}}", role="menuItem")
              label.close-dropdown-multi(for="checkbox-all-{{atts.id}}") {{atts.allOption.value}}
          +each options
            li.close-dropdown-multi(role="presentation")
              input.close-dropdown-multi.checkbox-options(class="check-onclick-#{this.class}", role="menuItem", type="checkbox", value="#{this.text}", id="checkbox-#{this.text}")
              label.close-dropdown-multi(for="checkbox-#{this.text}") {{this.text}}
        br

Файл схемы, который я использую:

  categories:
    type: [String]
    optional: false
    custom: ->
      if this.value.length == 0
        'atLeastOne'
    autoform:
      buttonText: 'Categories'
      label: false
      id: 'dropdown-nr-1'
      options: -> _.map CampaignCategories, (arg1) ->
        option =
          text: t "campaign.categories.#{arg1}"
          class: 'dropdown-vol-1'
      allOption:
        presence: false
        value: 'All'
      afFieldInput:
        type: 'dropdownMultiCheckbox'

  locations:
    type: [String]
    optional: false
    custom: ->
      if this.length == 0
        'atLeastOne'
    autoform:
      buttonText: 'Locations'
      label: false
      id: 'dropdown-nr-2'
      allOption:
        presence: true
        value: 'All'
      options: -> _.map CampaignLocations, (arg1) ->
        option =
          text: t "campaign.locations.#{arg1}"
          class: 'dropdown-vol-2'
      afFieldInput:
        type: 'dropdownMultiCheckbox'

ОТРЕДАКТИРОВАНО:

Ошибка вызвана массивом CampaignLocations в схеме, которая используется для i18n в приложении метеора. Это глобальная переменная, возможно, она каким-то образом меняет контекст метеора (и это значение), потому что загружает переменную вне текущего шаблона. Если я верну статическое значение, как показано ниже:

[{text: 'test',class: 'test'},{text: 'test',class: 'test'},{text: 'test',class: 'test'}]

Все нормально и ошибки нет.


person MatthewK    schedule 17.03.2015    source источник
comment
Я получал ту же ошибку, поэтому я немного отладил и обнаружил, что проблема в том, что я не включил «id» в свою форму. Изменение этого: {{>quickForm schema="Schema.Register" ...}} на это: {{>quickForm id="register" schema="Schema.Register" ...}} исправило то, что я испытывал. Может стоит изучить.   -  person Calebmer    schedule 18.03.2015


Ответы (1)


Я решил проблему. Проблема была очень простой, но «благодаря» тому, как javascript (и метеор) показывает ошибки, я не заметил, что пытался вложить форму внутрь формы, поэтому возникла «Неперехваченная ошибка: нет текущего представления».

Что застало меня врасплох, так это момент, когда в моей хромированной консоли появилась ошибка. Метеор не будет жаловаться на ошибки при использовании автоформы и вложенного тега формы внутри тега формы, когда свойство «параметры» генерируется со статическими данными, подобными этому.

[{text: 'test',class: 'test'},{text: 'test',class: 'test'},{text: 'test',class: 'test'}]

Но если вы будете использовать, например, такой код внутри свойства options:

  options: -> _.map CampaignLocations, (arg1) ->
    option =
      text: t "campaign.locations.#{arg1}"
      class: 'dropdown-vol-2'

При использовании интерполяции или конкатенации строк Meteor выдает ошибку.

person MatthewK    schedule 18.03.2015