2013-08-09 2 views
2

Я использую bootstrap-select, чтобы помочь вам выбрать элементы лучше в моем приложении Meteor.Meteor on change change update Элемент выбора шаблона

Однако я столкнулся с проблемой, когда после внесения изменений в Метеорную коллекцию реакционная способность отталкивается, возвращается к шаблонам, таким образом переписывая элементы выбора и уничтожая исходный элемент выбора, который также забирает вещи bootstrap-select ,

Интересно, есть ли у меня способ предотвратить это каким-то образом. Я попытался прослушать изменения и вспомнить selectpicker после обновления, но он не работает.

Applications.find().observe({ 
changed: function() { 
    console.log('something changed'); 
      $('.selectpicker').selectpicker(); 
} 
}); 

Я даже пытаюсь немного отложить дело, также безрезультатно.

Applications.find().observe({ 
changed: function() { 
    console.log('something changed'); 
    setTimeout(function(){ 
     $('.selectpicker').selectpicker(); 
     console.log('trying to update select picker'); 
    }, 1000); 
} 
}); 

Неужели кто-нибудь сталкивается с этой проблемой раньше и знает, как ее исправить?

EDIT: Вот код шаблона

<div class="form-group"> 
    <label for="college" class="control-label">College/ University</label> 
    <select class="selectpicker" name="college" placeholder="Select a College/ University"> 
     {{#each colleges}} 
      <option value="{{slug}}">{{name}}</option> 
     {{/each}} 
    </select> 
</div> 

ответ

1

В вашем HTML-шаблон, если окружить Select-элемент с the constant block helper, часть внутри постоянного блока не будет повторно вынесено. Может быть, это будет решение?

+0

Это хорошая идея. Но если он находится в постоянном блоке, означает ли это, что он не получит никакого обновления изменений модели? Будет ли блок сохранения работать? –

+0

@Tri - Это, как вы говорите: обновления документов в постоянном вспомогательном блоке не будут показаны. Лучшее место для размещения '$ ('. Selectpicker'). Selectpicker()', вероятно, находится в функции 'Template.yourTemplateName.rendered', но тогда выбранный элемент в элементе select-bootstrap будет создан с нуля на каждом повторе рендеринг, а предыдущий выбранный элемент больше не будет выбран. Я не могу придумать простой способ решить эту проблему, но если бы я был вами, я бы пошел с этим решением и дополнительно добавил 'selected =" выбранный '' к выбранному '

+0

Спасибо @Peppe, я уже вызываю его в функции «rendered», но это не решает проблему, упомянутую в моем вопросе, а именно, что при изменении модели элемент 'select' обновляется, тем самым загружая« bootstrap » -select'. –

1

У меня была та же проблема. Оказывается, что удаление пакета «сохранение-входы» из моего приложения Meteor помогло. Может быть, стоит попробовать? Или, если вы не хотите этого делать, использование атрибутов id и/или имени из вашего элемента select, похоже, оказывает такое же влияние.

+0

Я не думаю, что выбор 'id' или' name' - это хорошая идея - они есть по какой-то причине, как семантические, так и после обработки форм. –

+1

Нет, я бы тоже этого не делал. Лично мне еще предстоит найти разумно подходящую замену для приложения Meteor. – JyrkiH

1

С тех пор как задавался этот вопрос, ситуация немного изменилась. С новым движком рендеринга Blaze визуализированное событие будет выбрано только один раз. Во время рендеринга параметры недоступны, в результате получается приятный, но пустой выбор.

Следующий пример позаботится об этих изменениях. Трюк состоит в том, чтобы отобразить selectpicker один раз при запуске, а затем обновлять каждый раз, когда есть изменение в опции. Поэтому <option> необходимо перенести в собственный шаблонный блок.

Шаблон:

<template name="whatever"> 
<div class="form-group"> 
    <label for="college" class="control-label">College/ University</label> 
    <select class="selectpicker" name="college" placeholder="Select a College/ University"> 
     {{#each colleges}} 
      {{> selectOption}} 
     {{/each}} 
    </select> 
</div> 
</template> 

<template name="selectOption"> 
    <option value="{{slug}}">{{name}}</option> 
</template> 

JavaScript:

Template.whatever.rendered = function(){ 
    $('.selectpicker').selectpicker(); 
}; 

var renderTimeout = false; 
Template.selectOption.rendered = function(){ 
    if(renderTimeout !== false) { 
    Meteor.clearTimeout(renderTimeout); 
    } 
    renderTimeout = Meteor.setTimeout(function() { 
    $('.selectpicker').selectpicker("refresh"); 
    renderTimeout = false; 
    }, 10) 
}; 

Освежающий немного сложнее. Когда вы загружаете свою коллекцию в select, событие будет выбрано для каждой опции. В моем случае у меня есть сотни документов/вариантов. Это приводит к обновлению сотни раз, и браузер зависает в течение нескольких секунд. Поэтому есть небольшой тайм-аут, который заботится об освежении только один раз для большинства изменений.