有时不完整或没有数据 - Meteor

时间:2016-03-03 19:09:49

标签: javascript mongodb meteor meteor-blaze meteor-accounts

我正在尝试编辑和删除Mongo.Collection中的数据。我有一个包含电子邮件地址的许多字段的文档。

我在更新数据时检查,如果电子邮件存在只是更新电子邮件,则首先使用Accounts.createUser创建一个使用该电子邮件的用户,然后更新数据。虽然数据在数据库中成功更新,但使用帮助程序显示数据却无法正常工作。我试图用保存的值填充表单,表单填充半填充或完全填充(通常在第一次编辑尝试中)或完全清空。我无法理解这种行为背后的原因。

表单模板

<template name="addUnit">
    <div class="modal fade" id="addUnitModal" tabindex="-1" role="dialog">
      <div class="modal-dialog" role="document">
        <div class="modal-content">
          <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title">{{#if isEdit}}Edit {{else}}Add {{/if}}Unit</h4>
          </div>
            {{#if tenantError}}
                <div class="alert alert-danger" role="alert">{{tenantError}}</div>
            {{/if}}
            <form class="frmUnit" id="frmUnit">
                <div class="modal-body"> 
                    <input class="form-control" type="text" placeholder="Unit Name" name="unitName" value="{{selectedUnit.unitName}}"/>
                    <input class="form-control" type="number" placeholder="Number of Residents" name="residents" value="{{selectedUnit.residents}}"/>
                    <input class="form-control" type="number" placeholder="Area sqft." name="area" value="{{selectedUnit.area}}"/>
                    <input class="form-control" type="text" placeholder="Primary Tenant" name="primaryTenant" value="{{selectedUnit.primaryTenant}}"/>
                    <input class="form-control" type="email" name="tenantEmail" placeholder="Tenant's Email" value="{{selectedUnit.tenantEmail}}"/>
                    <input class="form-control"  type="password" name="tenantPassword" placeholder="Tenant's Password"/>
                </div>
              <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                {{#if isEdit}}
                    <button type="submit" class="btnEditUnit btn btn-primary">Edit Unit</button>
                {{else}}
                    <button type="submit" class="btnAddUnit btn btn-primary">Add Unit</button>
                {{/if}}

              </div>
          </form>
        </div>
      </div>
    </div>
</template>

助手

Template.addUnit.helpers({
    isEdit: function() {
        return Session.get('isEdit');
    },
    tenantError: function(){
        return Session.get('tenantError');
    },
    selectedUnit: function(){
        return Session.get('selectedUnit');
    }
});

事件

Template.addUnit.events({
    "submit .frmUnit": function(event){
        event.preventDefault();
        var form = event.target;
        if(!Session.get('isEdit')){
            console.log('adding');
            Meteor.call('addUnit', 
                Session.get('selectedBuilding')._id, 
                {
                    unitName: form.unitName.value, 
                    primaryTenant: form.primaryTenant.value, 
                    tenantEmail: form.tenantEmail.value,
                    tenantPassword: form.tenantPassword.value,
                    residents: form.residents.value, 
                    area: form.area.value
                }, function(error, result) {
                    console.log(error, result);
                    if(!error){
                        $('#frmUnit')[0].reset();
                        $('#addUnitModal').modal('hide');
                        Session.set('tenantError', null);
                    }else{
                        Session.set('tenantError', error.reason);
                    }
                });

        }else{
            console.log('editing');
            Meteor.call('editUnit',Session.get('selectedUnit')._id,{
                    unitName: form.unitName.value, 
                    primaryTenant: form.primaryTenant.value, 
                    residents: form.residents.value, 
                    area: form.area.value,
                    tenantEmail: form.tenantEmail.value,
                    tenantPassword: form.tenantPassword.value
                }, function(error, result) {
                    if(!error) {
                        $('#frmUnit')[0].reset();
                        $('#addUnitModal').modal('hide');
                    }else{
                        Session.set('tenantError', error.reason);
                    }
                });
        }
    }
});

在服务器上编辑单位

editUnit: function(unitId, unit){
    //if the email entered already exists update the email and password
    var updatedTenant = Accounts.findUserByEmail(unit.tenantEmail);
    if(updatedTenant){
      if(unit.tenantPassword && unit.tenantPassword  !== ""){
        Accounts.setPassword(updatedTenant._id, unit.tenantPassword);
      }
      Units.update({_id: unitId}, 
        {
          $set :{
            unitName:unit.unitName, 
            primaryTenant:unit.primaryTenant, 
            residents: unit.residents, 
            area: unit.area,
            tenantEmail: unit.tenantEmail
          }
        });

    }else{
      //if email doesn't exist already, create a new user first
      var newUserId = Accounts.createUser(
      {
        email: unit.tenantEmail, 
        password: unit.tenantPassword, 
        profile:{
          firstname: unit.primaryTenant, 
          lastname:"", 
          phone:"", 
          isTenant:true
        }
      });
      if(newUserId){
         Units.update({_id: unitId}, 
         {
          $set :{
            unitName:unit.unitName, 
            primaryTenant:unit.primaryTenant, 
            residents: unit.residents, 
            area: unit.area,
            tenantEmail:unit.tenantEmail
          }
        });
      }
    }
  },

Session.get('selectedUnit')是从另一个显示表单的单击处理程序设置的。正确设置该值我可以通过将其记录到控制台来查看。 'isEdit'也是从不同模板的点击处理程序设置的。

我有其他表单使用相同的方法,但他们没有帐户创建和验证。是因为那个吗?

修改

Template.owner.events({

"click .editUnit":function(){
        Session.set('isEdit', true);    
        Session.set('selectedUnit', this);
    }
});


{{#each buildingUnits}}
    <tr>
    <td>
        {{unitName}}
    </td>
    <td>
        <span class= "editUnit list-icon glyphicon glyphicon-edit"  data-target="#addUnitModal" data-toggle="modal" aria-hidden="true" style="padding-right: 4px;"></span>
        <span class= "deleteUnit list-icon glyphicon glyphicon-remove" aria-hidden="true"></span>
        </td>
    </tr>
{{/each}}

我已经尝试将其记录到控制台上,我得到了正确的结果,就在我尝试使用Session.get('selectedUnit')恢复会话的两行之后,并尝试将其记录到控制台,这也是给我正确的结果,这意味着会话正在成功设置。

0 个答案:

没有答案