Сначала выберите в выпадающем JQuery - PullRequest
0 голосов
/ 24 мая 2018

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

Вот HTML-код:

        <select id="module-select" class="form-control">
            <option disabled="disabled" selected="selected">Select Assessment</option>
            {{#each modules}}
                 <option value="{{this.name}}">{{this.name}}</option>
            {{/each}}
        </select>

Я использую следующий код шаблона, чтобы сделать что-то после изменения выбора, и хотел бы продолжить так же.

"change #module-select": function(event, template){
     var module_name = $(event.currentTarget).val()
     console.log("assessment: ", module_name)
     Session.set("Assessment_name", module_name)
 }

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

, если вы не хотите устанавливать переменную сеанса 'Assessment_name' с одним и тем же значением дважды, я предполагаю, что это позволит избежать других побочных эффектов этого параметра.И поэтому я предполагаю, что вы хотите снова запретить установку, только если это текущее значение переменной, поэтому, если для переменной сеанса было установлено значение другого элемента в раскрывающемся списке, вы не будете возражать, если он изменится, даже еслиэлемент, на который он меняется, был выбран в прошлом.Поэтому, если эти предположения верны, то достаточно просто проверить значение переменной сеанса, чтобы предотвратить установку того же значения:

"change #module-select": function(event, template){
     var module_name = $(event.currentTarget).val()
     console.log("assessment: ", module_name)
     if (Session.get("Assessment_name") !== module_name) {
       Session.set("Assessment_name", module_name)
     }
   }
0 голосов
/ 24 мая 2018

В идеале, это будет запускать код только при первом выборе элемента в раскрывающемся списке, а не после него

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

Входными данными для этой структуры является ваш список modules.Кэш, который проверяет, был ли загружен модуль, является объектом.Рассмотрим следующий список имен модулей и пустой объект:

Template.yourTemplate.onCreated(function() {
  const instance = this;
  instance.state = new ReactiveDict();
  instance.state.set('modules', ['a', 'b', 'c']);  
  instance.state.set('loaded', {});
});

Вы можете загрузить модуль и затем добавить запись в объект, который был загружен модулем:

// outside the template functions
function loadOnce(module, templateInstance) {
  const loaded = templateInstance.state.get('loaded');

  // return if already loaded
  if (loaded[module]) return;

  // else load module and set as loaded
  Session.set("Assessment_name", module_name)
  loaded[module] = true;
  templateInstance.state.set('loaded', loaded);
}

Template.yourTemplate.events({
  "change #module-select": function(event, template){
    var module_name = $(event.currentTarget).val()
    loadOnce(module_name, template); 
  }
});

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

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

function loadOnce(module, templateInstance) {
  const loaded = templateInstance.state.get('loaded');
  const modules = templateInstance.state.get('modules');
  // return if already loaded
  if (loaded[module]) return;

  // else load module and set as loaded
  Session.set("Assessment_name", module_name)
  loaded[module] = true;
  modules.splice(modules.indexOf(module), 1);
  templateInstance.state.set('loaded', loaded);
  templateInstance.state.set('modules', modules);
}

Общее замечание по безопасности: это не помешает клиентам загружать модули, если они намерены.Это только функциональность UI / UX, но она не остановит загрузку модуля при желании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...