2015-01-15 2 views
5

В Метеор, я посылаю два объекта из моей БД в качестве шаблона:Доступ шаблон помощник словарь в обработчик события Метеор

Template.myTemplate.helpers({ 
    helper1: function() { 
    var object1 = this; // data context set in iron:router...path is context dependent 
    // modify some values in object1 
    return this; 
    }, 
    helper2: function() { 
    return Collection2.find({_id: this.object2_id}); 
    } 
}); 

Этот шаблон также имеет обработчик событий, чтобы изменить два объекта выше. Я пытаюсь получить доступ к helper1 и helper2 сверху, но если я вызову контекст данных шаблона, я получаю доступ к немодифицированной версии объекта1. Как получить доступ к помощникам, определенным выше?

Template.myTemplate.events({ 
    'submit form': function(event) { 
    event.preventDefault(); 
    // Access helper2 object and attributes here instead of calling Collection2.find() again 
    } 
}); 
+2

Там нет никакого способа вызвать помощник с текущей общественной API. –

+1

Peppe, вы можете это знать, но я только что обнаружил, что есть внутренний api для доступа к помощникам - Template.myTemplate .__ helpers.get ('helper'); – bgmaster

+0

Учитывая, что это внутреннее, я предполагаю, что api может измениться в будущем, поэтому может быть не самая лучшая идея часто использовать это в вашем коде. – bgmaster

ответ

4

Помощников просто функции и, таким образом, могут быть розданы и переданы другими переменными по желанию, так что вы могли бы определить функцию, а затем присвоить ему ключ helper2 из хелперов шаблона и позвонить по его оригинальная ссылка из обработчик события.

var helperFunction = function() { 
    return Collection2.find({_id: this.object2_id}); 
}; 

Template.myTemplate.helpers({ 
    helper1: function() { 
     var object1 = this; // data context set in iron:router...path is context dependent 
     // modify some values in object1 
     return this; 
    }, 
    helper2: helperFunction 
}); 

Template.myTemplate.events({ 
    'submit form': function(event) { 
     event.preventDefault(); 
     var cursor = helperFunction(); 
    } 
}); 
+0

Спасибо. Этот шаблон немного помогает избежать повторения кода, к которому я стремился. Единственное, что я хотел бы отметить, это в функции может измениться. Когда вы вызываете функцию в обработчике событий, это становится объектом Window вместо контекста данных. Я нахожу это странным, учитывая это в обработчике событий, который по-прежнему является контекстом данных. Если вы сможете обновить свой ответ, чтобы отразить это, я буду отмечать его как правильно. – bgmaster

+0

Как отметил @bgmaster, вам нужно вызвать [метод вызова] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call) и предоставить 'thisArg 'вместо простого вызова функции. Однако, в случае, вы не знаете, что должно быть 'thisArg' (и это могут быть разные разные времена' {{helper2}} ', поэтому это вообще не работает). –

0

Если вы можете изменить хелперы от событий, то любая часть приложения Метеор может сделать, что противоречит философии дизайна Blaze!

Blaze предназначен для однонаправленной системы забора привязки данных. То, о чем вы просите, может быть достигнуто с помощью Angular (используется самостоятельно или бок о бок с Blaze, посмотрите на THIS), который по своей природе представляет собой систему двусторонней привязки данных.

Вы также можете проверить React, который также 2 путь данные через связывание

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