【问题标题】:How can I get the input id from the submit event in meteor?如何从流星的提交事件中获取输入ID?
【发布时间】:2014-11-02 16:49:51
【问题描述】:

在一个模板中,我有:

    <template name="moviesTemplate">
     <form>
       <ul>
         {{#each movies}}
           <li>
             {{title}} <input id="{{title}}" type="submit" value="Delete" />  
           </li> 
         {{/each}}
      </ul>
    </form>
    </template> 

当用户在moviesTemplate 上单击删除时,我想从我的javascript 文件中的事件中找到输入元素的id 属性:

Template.moviesTemplate.events = {
    'submit': function (e, tmpl) {
        e.preventDefault();
        var theId = theButtonThatRaisedTheEvent.id.toString();  // <--- This is what I'm referring to

     }
 }

我怎样才能找到这个元素?我以为是'e',但我似乎无法从中获得任何身份。可能是我误会了……

编辑 1:

好的,看来 'e' 是事件,它不包含任何与源元素相关的信息。我该怎么做才能做到这一点?我是否需要重新考虑我是如何做到这一点的?

【问题讨论】:

    标签: javascript html node.js meteor


    【解决方案1】:

    您可以创建单个提交表单事件,并有条件地检查事件目标字段。根据您要插入的集合调用适当的 Meteor 方法。

    Template.detailsViewTemplate.events({
        'submit form': function(ev){
            ev.preventDefault();
    
            var detail_input_field = template.$('#detail_entry');
            var message_input_field = template.$('#message_entry');
    
            if(detail_input_field != undefined){
                var detailFormData = {
                detail: $(ev.target).find('[name = detail]').val(),
                parentId: $(ev.target).find('[name = parentId]').val(),
                checkboxStatus: ''
                }
    
                Meteor.call('addDetail', detailFormData);
                $('.form-group').children().val('');
    
            } else if(message_input_field != undefined){
                var newMessageData = {
                    listId: this.params_id,
                    message: $(ev.target).find('[name = message]').val()
                }
                Meteor.call('addMessage', newMessageData);
                $('.form-group').children().val('');
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      在我看来,id 属于表单,而不是提交按钮。我会使用以下内容:

      <template name="main">
          <form data-id="anId">
              <input type="submit" value="Delete!">
          </form>
      </template>
      
      Template.main.events({
          'submit form': function(event, template){
              event.preventDefault() // Don't submit it!
              var id = event.currentTarget.getAttribute('data-id') // Get the id attribute.
              console.log(id)
          }
      })
      

      更新

      将您现在拥有的模板替换为:

      <template name="moviesTemplate">
          <ul>
              {{#each movies}}
                  <li>
                      <form data-id="{{title}}">
                          {{title}} <input type="submit" value="Delete" />  
                      </form>
                  </li> 
              {{/each}}
          </ul>
      </template>
      

      并使用之前在这篇文章中编写的事件处理程序。

      实际上,事件处理程序中的this 将是电影的上下文,因此处理程序可以简单地为:

      Template.main.events({
          'submit form': function(event, template){
              event.preventDefault() // Don't submit it!
              var id = this.title // Get the title through the context.
              console.log(id)
          }
      })
      

      所以不需要在表单上使用data-id 属性。

      【讨论】:

      • 我已经更新了我的问题。我实际遇到的问题(我应该提到的)是我正在处理列表中每个项目的删除按钮。生成列表时,将使用数据库中项目的 id 的 id 创建按钮。
      • @drminnaar,这不是您的模板,所以您可以更改它吗?否则我会选择 Kuba Wyrobeks 解决方案。
      • 它是我的,但你的意思是改变它?您是否建议我改变设计模板的方式 - 如果可以,您能否举例说明如何使用相应的删除按钮实现 List?
      • 完美——优雅。谢谢。
      【解决方案3】:

      使用tmpl.find 并获取id

      Template.moviesTemplate.events = {
           'submit':function(e, tmpl){
               e.preventDefault();
            },
           'click input[type="submit"]':function(e, tmpl){
               console.log(e.currentTarget.id)
           }
       }
      

      Proof

      【讨论】:

      • 如果我有多个删除按钮(来自每个循环)怎么办?肯定有办法访问引发事件的实例吗?
      【解决方案4】:

      不幸的是;这不是那么简单。

      起点是similar to this answer 但是您可能想要处理诸如在元素上按下“enter”键之类的事情

      Template.moviesTemplate.events = {
          'click input[type=submit]': function(e, tmpl){
             tmpl.find('input[type=submit]').data('clicked',false);
             $(e.currentTarget).data('clicked',true);
          },
          'submit': function (e, tmpl) {
              e.preventDefault();
              var theId = tmpl.find('input[type=submit]').filter(function(i,ele){
                return $(ele).data('clicked');
              }).get(0).attr('id');    
           }
      }
      

      【讨论】:

      • 我询问是否有替代方法的原因是,可删除项目列表在任何应用程序中都是极其典型的场景。为什么从列表中删除项目的解决方案如此复杂?我在这里错过了什么吗?
      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多