从Meteor.js中的Array中删除Item

时间:2013-07-11 00:48:37

标签: javascript meteor

我有一个名为Rulesets的集合 - 每个规则集都有一个“规则”数组。我有以下html显示每个规则集和每个规则:

<template name="rulesets">
    {{#each rulesets}}
        {{>rulesetSingle}}
    {{/each}}
</template>

<template name="rulesetSingle">
    {{#each rules}}
         <p class="rule-description">{{this}}
             <a href="#" class="rule-delete-btn">x</a>
         </p>
    {{/each}}
</template>

我希望能够在用户点击“rule-delete-btn”时删除该规则 我有以下javascript来执行此操作:

Template.rulesetSingle.event({
    'click .rule-delete-btn': function(e){
        e.preventDefault();
        var array = Rulesets.rules;
        var index = array.indexOf(this);
        array.splice(index, 1);
    }
});

删除无效,因为“数组”声明未提取有效数组。如何找到并存储包含“this”的数组,这是当前需要删除的规则?

1 个答案:

答案 0 :(得分:3)

假设您的Rulesets.rules数组是一个对象数组,如:

Rulesets : { { title: 'title1', 
               rules : [ {name : 'rule1', description : 'description1'}, 
                         {name : 'rule2', description : 'description2'}
                       ]
             },
             { title: 'title2', 
               rules : [ {name : 'rule1', description : 'description1'}, 
                         {name : 'rule2', description : 'description2'}
                       ]
             } }

首先,在您的rulesetSingle模板中,您必须将该特定文档的_id分配给<a>,如:

<a href="#" name="{{../_id}}"class="rule-delete-btn"> x </a>

第二件事,您尝试使用Array.splice()删除规则条目,这是不可能的,因为rules是集合中的文档。您必须update查询Rulesets.update()

如果您已在服务器上完成allow update,则可以从事件处理程序中删除此数组条目,否则必须通过Meteor.call() rule传递_id 'click .rule-delete-btn': function(e) { e.preventDefault(); var rule = this; var id = e.currentTarget.name; Meteor.call('removeRule', id, rule); } 父文件。

因此,事件处理程序将类似于:

  Meteor.methods({
    removeRule: function(id, rule){
      Rulesets.update({_id: id}, {$pull : {rules : rule}});
    }
  });

在服务器上:

{{1}}