关闭可信区域的反应性(流星)

时间:2015-02-08 01:33:03

标签: meteor

我知道您可以在获取集合时关闭与reactive: false的反应。如何在一个可信区域内的收集领域完成相同的工作?例如:

Template.documentPage.events({
  'input .document-input': (function(e) {
    e.preventDefault();

    content = $(e.target).html();
    Documents.update(this._id, {
      $set: {
        content: content
      }
    });
   }
});

<template name="documentPage">
  <div class='document-input' contenteditable='true'>{{{content}}}</div>
</template>

2 个答案:

答案 0 :(得分:1)

转变例如帮助程序或其他反应函数使用Tracker.nonreactive(fn)包装您的函数。请参阅:http://docs.meteor.com/#/full/tracker_nonreactive

答案 1 :(得分:0)

您可以将反应数据设置为属性并将其移至onRendered

中的html
<div class="form-group required">
        <label class="col-sm-2 control-label" for="input-firstname"><?php echo $entry_firstname; ?></label>
        <div class="col-sm-2">
          <input type="text" name="firstname" value="<?php echo $firstname; ?>" placeholder="<?php echo $entry_firstname; ?>" id="input-firstname" class="form-control" />
          <?php if ($error_firstname) { ?>
          <div class="text-danger"><?php echo $error_firstname; ?></div>
          <?php } ?>
        </div>
      </div>
      <div class="form-group required">
        <label class="col-sm-2 control-label" for="input-lastname"><?php echo $entry_lastname; ?></label>
        <div class="col-sm-2">
          <input type="text" name="lastname" value="<?php echo $lastname; ?>" placeholder="<?php echo $entry_lastname; ?>" id="input-lastname" class="form-control" />
          <?php if ($error_lastname) { ?>
          <div class="text-danger"><?php echo $error_lastname; ?></div>
          <?php } ?>
        </div>
      </div>

这样,数据内容属性将通过输入而不是元素的文本进行更新。

安全注意:我将模板更改为使用<template name="documentPage"> <div class='document-input' contenteditable='true' data-content='{{content}}'></div> </template> Template.documentPage.onRendered(function () { var doc = this.find(".document-input"); doc.innerHTML = doc.dataset.content; }); 而不是{{content}},因此可以通过流星进行转义,但使用{{{content}}},因此内容将是&#34;未转义&#34;在元素中。每当您从用户输入呈现html时,您应该确保清理它,这样您就不会在您的网站中打开xss漏洞。

另一种方法是使用像https://github.com/UziTech/jquery.toTextarea.js这样的库来将div的可编辑内容更改为文本,并使用doc.innerHTML代替doc.textContent以删除任何xss的机会