如何访问嵌套模板属性?

时间:2014-10-24 14:28:26

标签: meteor quill

我成功实现了一个带有quill wysiwyg的表单,但现在我想创建一个组件来重用它。这是我的工作实施:

<template name="form">
  <form>
    <div id="toolbar"> ... html with toolbar buttons </div>
    <div id="editor"></div>
    <input type="submit" value="save"/>
  </form>
</template>
Template.form.rendered = function () {
  this.quill = new Quill('#editor', { 
    modules: {
     'toolbar': { container: '#toolbar' },
     'link-tooltip': true
    },
    theme: 'snow' }
  );
}

Template.form.events({
  'submit form': function(e, tmpl) {
    e.preventDefault();
    var html = tmpl.quill.getHTML();
    // code to save the form data
}

这就是我想让它重复使用的原因。我的问题在代码中:

<template name="form">
  <form>
    {{> editor }}
    <input type="submit" value="save"/>
  </form>
</template>

<template name="editor">
  <div id="toolbar"> ... html with toolbar buttons </div>
  <div id="editor"></div>
</template>
Template.editor.rendered = function () {
  this.quill = new Quill('#editor', { 
    modules: {
     'toolbar': { container: '#toolbar' },
     'link-tooltip': true
    },
    theme: 'snow' }
  );

  // How can I pass quill to the parent template?

}

Template.form.events({
  'submit form': function(e, tmpl) {
    e.preventDefault();

    // How can I access quill variable on the nested template, so I can 
    // call quill.getHTML()?

}

1 个答案:

答案 0 :(得分:2)

这是我用来解决这类问题的模式。定义一个名为Editor的类和一个模板editor。目的是editor内的数据上下文将是Editor的实例。

function Editor() {
  this.quill = null;
}

Template.editor.rendered = function () {
  this.data.quill = new Quill(...);
}
<template name="editor">...</template>

form created内部回调中,创建一个Editor并将其存储在模板实例中。然后,当您呼叫editor模板时,请将Editor实例作为数据上下文传递。

Template.form.created = function () {
  this.editor = new Editor();
}

Template.form.helpers({
  editorInstance: function () {
    return Template.instance().editor;
  }
});
<template name="form">
  <form>
    {{> editor editorInstance }}
    <input type="submit" value="save"/>
  </form>
</template>

然后,您可以在Editor原型上定义可由form调用的方法:

Editor.prototype.getTextAsHTML = function () {
  return this.quill && this.quill.getHTML();
}

Template.form.events({
  "submit form": function(e, tmpl) {
    e.preventDefault();
    var html = tmpl.editor.getTextAsHTML();
    // ...
  }
}

这是抽象editor详细信息的好方法,以便form不需要了解它。您可以重复使用editor,如果您想要更改它,则必须确保getTextAsHTML的工作方式相同。