【问题标题】:Meteor Blaze helper and Mongo collection.find with Session key selectorMeteor Blaze 助手和 Mongo collection.find 与会话键选择器
【发布时间】:2021-07-30 08:40:33
【问题描述】:

这个 Meteor 代码使用 Meteor Blaze 模板助手,它为一些 html 元素提供来自 mongo 集合的数据。

collection.findOneSession.get 作为选择器,因此当 Session 键没有值时,我会在模板中获得一个空对象,这样我就不会获得任何数据,即空白元素。但我仍然在某些元素中获得价值。主要是 html 文件中注释的可编辑的 divspan 和一个 input 元素。

我哪里做错了? 我试图通过设置Session.set('plate', '') 触发事件来清理“表单”,即会话键“plate”的空白值、空对象、Blaze 模板没有数据、清除元素,对吗? 谢谢

//client/main.js

Meteor.startup(function(){
  listenToEvents()
})

///// globle listener /////
function listenToEvents(){
  $('.new').on('click', function(e){
    let elementId = $(this).parents('div')[2].id 
    if(elementId == 'vehicle'){
      Session.set('plate','') //<<< used in mongo collection selector
    }
  })
}


///// Blaze helper /////
Template.vehicle.helpers({
  'vehicle' : function(){
    if(Session.get('plate') == undefined){
      console.log('no plate selected')
      return
    }
    let searchForPlate = { "$regex" : Session.get('plate') , "$options" : "i"} // set to '' by event above 
    let vehicle = Vehicles.findOne({'plate': searchForPlate})

    if(!vehicle){ 
      console.log('empty vehicle object')
      return {}
    }
    console.log('vehcile selected: ', vehicle)
    
    if(vehicle.vin.length == 17){ 
      vehicle.vin_a = vehicle.vin.substr(0, 9)
    }
    vehicle.remain = Math.round(diff)
    if(diff <= 0) vehicle.expired = true
 
    return vehicle
  }
})
<template name="vehicle">
  <div id="vehicle" class="subject-container" >

    <div class="section-head">
      <div class="control">
        <button class="toggle">-</button>
        <button class="new">N</button>
      </div>
      <div>
      <!-- the next input does not get cleared -->
        <input id="plate" type="text" size="6" placeholder="plate" value={{vehicle.plate}}>
        
        <!-- the next span does not get cleared -->
        <span data-expired={{vehicle.expired}}>{{vehicle.remain}} {{vehicle.expiry}}</span>
      </div>
    </div>
    
    <div class="body">
      <!-- the next div does not get cleared -->
      <div id="vin" class="editable" contenteditable="true">{{vehicle.vin_a}}<span id="vinb">{{vehicle.vin_b}}</span><span id="vin4">{{vehicle.vin4}}</span></div>
      <input type="text" placeholder="YR, make, modle" value={{vehicle.info}}>
    </div>
  </div>
</template>

【问题讨论】:

    标签: javascript html meteor meteor-blaze


    【解决方案1】:

    嗯,不,一个空的正则表达式匹配所有内容。如果您打开 mongo shell 并对任何包含内容的集合运行类似的查询,这很容易测试:

    rs0:PRIMARY> db.users.find({_id: {$regex: ''}}).count()
    2723
    

    我只是明确地防范这种情况,您可以像这样轻松地做到这一点:

        if (!Session.get('plate')){
          console.log('no plate selected')
          return
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      • 2015-03-23
      • 2014-05-27
      • 1970-01-01
      • 2021-07-28
      相关资源
      最近更新 更多