2015-09-30 5 views
1

У меня есть потребность в первый заселить набор отдельных элементов со значениями, например, так:Будет ли вспомогательный метеор, который считывает значение из элемента, автоматически будет повторно выполняться при изменении значения этого элемента?

<select class="jobLoc" id="date1Shift1JobLoc1" name="date1Shift1JobLoc1"> 
    {{#each jobLocations}} 
    <option value={{jl_jobloc}}>{{jl_jobloc}}</option> 
    {{/each}} 
</select> 

... но затем обновить те (замена первоначального супернабор joblocs с подмножеством), когда другой, связанный выберите изменения элементов.

Помощник возвращает набор документов на основе значения, связанный выбор элемента, что-то вроде этого (псевдокода):

Template.tblScheduler.helpers({ 
    jobLocations: function() { 
    var worker = $('#worker').val; 
    if (worker == '') { 
     return JobLocations.find(); // return all 
    } else { 
     return JobLocations.find({ jl_workerid: worker }); // a worker was selected; use it to return a subset 
    } 
    } 
}); 

Когда шаблон первый вынесенное «date1Shift1JobLoc1Count» выбрать элемент заселен со всеми трудовыми книгами; однако, если выбран рабочий, параметры «date1Shift1JobLoc1Count» должны быть очищены, а затем заменены соответствующим подмножеством.

Вопрос в том, будет ли это работать автоматически, из-за того, что Метеор видит, что помощник полагается на значение элемента «#worker» select? Надеюсь, что так ... но ожидайте, что я надеюсь на слишком много. Если мои сомнения обоснованы, как я могу вернуть помощника для повторного запуска и шаблон для повторной рендеринга? Нужно ли мне это делать из обработчика событий шаблона, примерно так:

Template.tblScheduler.events({ 
    "change #worker": function (event) { 
     // Is it possible to call the jobLocations helper from here? 
    } 
}); 

? Или я должен сделать это «вручную» оттуда, что-то вроде (псевдокод):

Template.tblScheduler.events({ 
    "change #worker": function (event) { 
     var worker = $('#worker').val; 
     var arrayOfDocs = Meteor.call('getJobLocsForWorker(worker))'); 
     // assign the values in arrayOfDocs to the "date1Shift1JobLoc1" select element 
    } 
}); 

Или есть другой способ?

+1

Обратите внимание, что использование '= = 'в вашем коде будет соответствовать любому значению false, включая' 0', 'null' или' undefined'. –

ответ

3

JQuery элементы будучи неактивными источниками данных и так helpers зависят от него, я считаю, вам лучше всего обернуть это значение в ReactiveVar:

var worker = new ReactiveVar('') 

Template.tblScheduler.helpers({ 
    jobLocations : function() { 
    var workerValue = worker.get() //<- Register the dependency 
    //Your cursor logic here 
    } 
}) 

Template.tblScheduler.events({ 
    'change #worker' : function() { 
    worker.set($('#worker').val) 
    } 
}) 

Вы можете _.debounce обработки вашей change события так, чтобы пользователь не видит, чтобы весь пользовательский интерфейс мигал и обновлял каждую букву (и), которую он набирает.

+0

Где должно быть указано определение рабочего - вверху файла .js, который ссылается на него? –

+1

У вас есть несколько вариантов. Либо поместите его в данные экземпляра шаблона, либо как здесь, в области выше. –

3

Одним из возможных решений является прямое указание, что помощник зависит от вашего селектора #worker. Вы можете сделать это, используя объект Dependency.

var workerDep = new Deps.Dependency(); 

Затем использовать этот объект для "флаг" помощника, как это:

Template.tblScheduler.helpers({ 
    jobLocations: function() { 
    workerDep.depend();     // <----------- 
    var worker = $('#worker').val; 
    if (worker == '') { 
     // ... 

Чтобы вызвать явную зависимость, использование:

Template.tblScheduler.events({ 
    "change #worker": function (event) { 
    workerDep.changed();    // <----------- 
+1

Когда два ответа одинаковы, за исключением другого API = p –

+1

@Kyll LOL :) Я не знал о реактивных варах, хотя, спасибо за непроизвольный отзыв! –

 Смежные вопросы

  • Нет связанных вопросов^_^