流星数据未在更新时更新

时间:2014-07-18 13:42:01

标签: javascript jquery meteor

我遇到了让Meteor正确更新的问题。我的模板如下:

  <template name="hello">
     <h1>Hello World!</h1>
     <table>
        {{#each items}}
        {{>demoRow}}
        {{/each}}
     </table>
  </template>
  <template name="demoRow">
     <tr>
     <td>{{order}}</td>
     <td>
          <input type="text" class="nameChanger" name="demoName-{{name}}" data-demoname="{{name}}"     style="width: 90px" value="{{name}}"/>
      </td>
  </tr>
  </template>

脚本文件如下所示:

Template.hello.items = function () {
      var entity= Entities.findOne(Session.get('entityId'));
      if(entity!=null) {
         return Entities.findOne(Session.get('entityId')).items;
      }
      return null;
   };
Template.hello.events({
      'change .nameChanger': function(evt) {
          var $tgt = $(evt.target)
          var entity=Entities.findOne(Session.get('entityId'));
          var items = entity.items;
          var tgtName = $tgt.data('demoname');
          var newName = $tgt.val();
          var found=false;
          for(var i=0;i<items.length;i++) {
              var item=items[i];
              if(item.name == tgtName) {
                  item.name =newName;
                  found=true;
              }
          }
          if(!found) {
              alert("Cannot find ",tgtName);
          }
          Entities.update({_id: entity._id}, {$set: { items: items}});
      },
    });

最后,我的初始值设置为:

Entities.insert( { type: 'test',
                 items: [
                     {name: 'value1'},
                     {name: 'value2'},
                     {name: 'value3'}
                     ]
             }
         );

这将呈现一个文本输入表。当我更改其中一个文本字段时,它会自动更新实体集合,并且显示屏会显示正确的数据。但是,如果我尝试再次更改同一个字段,我的警报将会触发,因为它无法找到该值。

真正有趣的部分是tgtName具有原始的,未更改的值。但是,evt.target具有使用新名称的正确,更新的数据集。我甚至可以通过evt.target.dataset['demoname']获得正确的名称,这是我现有的解决方法。

我的问题是,为什么ID $tgt.data()没有保存更新的值?

我应该提一下,这会适当地更新其他窗口,如果我在一个窗口中更新它然后在另一个窗口中更新相同的值,它确实可以正常工作,第一次。在那之后,两个窗口似乎都存放了第一次更新时的价值。这几乎就像某种范围问题,但我无法弄清楚在哪里。

由于

2 个答案:

答案 0 :(得分:0)

猜测,但也许更新是做错了。也许您可以尝试更新单个编辑的项目。试试这个:

Template.hello.events({
  'change .nameChanger': function(evt) {
      var $tgt = $(evt.target)
      var entity=Entities.findOne(Session.get('entityId'));
      var items = entity.items;
      var tgtName = $tgt.data('demoname');
      var newName = $tgt.val();
      var found=false;
      for(var i=0;i<items.length;i++) {
          var item=items[i];
          if(item.name == tgtName) {
              item.name =newName;
              found=true;
              break;
          }
      }
      if(!found) {
          alert("Cannot find ",tgtName);
      }
      else
        Entities.update({_id: entity._id}, {$set: { 'items.' + i.toString(): item}});
  },
});

有点笨重,但也许......

答案 1 :(得分:0)

这是jQuery与Meteor(或任何其他试图修改数据属性的东西)的限制

  

数据属性在第一次访问数据属性时被拉出,然后不再被访问或变异(所有数据值都在内部存储在jQuery中)。

所以,选项是不使用jQuery并按照规定访问evt.target.dataset['demoname'],或者使用jQuery.attr()

$tgt.attr("data-demoname")

感谢流星的mizzao和dgreensp寻求帮助(https://github.com/meteor/meteor/issues/2329