【问题标题】:How Do I Pass Input Values to Helper Functions in Meteor?如何将输入值传递给 Meteor 中的辅助函数?
【发布时间】:2015-11-18 06:39:57
【问题描述】:

我正在构建一个从 ebay 列表中提取数据的订单。它有一个部分,您可以在其中添加行项目,并且您可以使用按钮添加另一个项目。它添加了另一个模板实例(使用 lineItems 帮助器迭代)这工作正常。

因此,在该模板中,我需要它使用 eBay api 进行搜索(我已经设置了一个 Meteor 方法来执行此操作,我不想包含它,因为它包含敏感信息)。您将 eBay 列表的 ID 输入到输入中,它会自动填写行项目的信息,例如列表的标题。

那么如何通过我的 getEbayItemTitle 助手传递参数(我想从输入值中获取的列表 ID)?

这是我的辅助函数:

 getEbayItemTitle: function (id) {

    Meteor.call('getEbayItemData', id, function(error, result) {
       Session.set('ebayFetch', JSON.parse(result.content));
    });
    var item = Session.get('ebayFetch');

    return item.Item.Title;
 }

在我的模板中: (我用 LISTING ID 代替了我的实际列表 ID)

 {{#each LineItems}}
    <!--some HTML -->
    <input type="text" class="order-ebay-id" placeholder="Ebay Id">
    <!--some HTML -->
    {{getEbayItemTitle 'LISTING ID'}}
    <!-- some HTML -->
 {{/each}}

我以前通过一种完全不同的方式对其进行编码来实现这一点...我将每个行项目附加到 jQuery 作为一个 div。但问题是,您需要输入 ebay 列表 ID 两次才能最终显示标题。 所以我想我需要使用模板和辅助函数,以便数据是反应性的。

我真的希望这是有道理的。

【问题讨论】:

  • 不完全是重复的,但我强烈建议阅读this question 的答案。
  • @DavidWeldon 谢谢!我正在使用我接受的答案,但该信息非常有用

标签: javascript meteor spacebars


【解决方案1】:

执行 Meteor.call() 本身在帮助程序中调用外部 API 可能会很昂贵。在您的助手中添加console.log() 以查看它的运行频率!但是回到您的问题,如果您事先知道 listingID,则将 listingId 作为参数传递给助手的方法是正确的。但是,由于它是用户输入,因此您需要从帮助程序中的 DOM 中提取它。

 getEbayItemTitle: function(){
   var title = "";
   var listingId = $('.order-ebay-id').val();  // get value from input field
   if ( listingId.length() > 0 ){
     console.log('Meteor.call with listingId '+listingId);
     Meteor.call('getEbayItemData', listingId, function(error, result) {
       Session.set('ebayFetch', JSON.parse(result.content));
     });
     title = Session.get('ebayFetch').Item.Title;
   }
 return title;
 }

比助手更好的方法是将事件绑定到输入字段。

Template.myTemplate.events({
  'blur .order-ebay-id': function(ev){
    var listingId = $('.order-ebay-id').val();  // get value from input field
    if ( listingId.length() > 0 ){
      Meteor.call('getEbayItemData', listingId, function(error, result) {
        Session.set('ebayFetch', JSON.parse(result.content));
      });
    }
  }
})

然后让助手返回会话变量:

 getEbayItemTitle: function(){
   var title = "";
   if ( Session.get('ebayFetch') ) title = Session.get('ebayFetch').Item.Title;
   }
 return title;
 }

【讨论】:

  • 我不知道为什么,但出于某种原因,我试图在任何地方调用我的方法,但在事件中!谢谢! :)
  • 作为一个随机的附带问题...我通常在输入事件中使用更改。有什么理由我应该使用模糊吗?
  • On change 将导致在键入每个字符后调用该方法。 On blur 将在他们离开场地后进行。对于 eBay 拍卖 ID,部分搜索没有意义。
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 2013-01-16
  • 2018-05-12
  • 1970-01-01
  • 2014-04-30
  • 2020-07-17
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多