【问题标题】:Meteor data-context with iron-router带有铁路由器的流星数据上下文
【发布时间】:2014-03-02 00:58:54
【问题描述】:

我是 Meteor 的新手,我正在尝试在显示一个段落的页面中设置数据上下文。我需要访问passage_item.js Template.passageItem.rendered 中的数据,但此时没有设置上下文。我想我需要类似 {{#withpassage}} 的东西,但 one_passage.html 中不存在“passage”。

这里有一些代码 sn-ps。谢谢。

路由器.js

Router.map(function() {
    this.route('passagesList', {path: '/'});
    this.route('onePassage', { 
    path: '/passages/:_id',
    data: function() { return Passages.findOne(this.params._id); }
    });
});

one_passage.html

<template name="onePassage">
    {{> passageItem}}
</template>

passage-item.html

<template name="passageItem">
  <div class="passage">
    <div class="one-passage">
      <h4><a href= "{{pathFor 'onePassage'}}">{{title}}</a></h4>
     <div class="passage-content">
    {{content}}
     </div>
   </div>
 </div>

passage_item.js

Template.passageItem.helpers({
});

Template.passageItem.rendered = function() {
    Meteor.defer(function() {
    $('.passage-content').lettering('words');
   //I want to be able to access the data object here. I have a list of words that are highlighted
    });
};

【问题讨论】:

  • 我最终做的是将 PassageId 添加到 html 中。
    然后在 javascript 中再次将其取出并使用它来获取数据。 var passId = $('.one-passage').attr('id');数据 = Passages.findOne(passageId);

标签: meteor iron-router


【解决方案1】:

从 Meteor 1.0.3.1 开始,新的 Iron Router 数据选择器似乎是...

Template.TemplateName.rendered = function() {
  console.log(UI.getData());
};

【讨论】:

  • 这应该是答案!
【解决方案2】:

收藏

假设您像这样创建了 Passages 集合,并且您已启用自动发布(默认情况下):

Passages = new Meteor.Collection('passages');

路由器地图

然后你像这样映射你的路由器:

Router.map(function() {
    this.route('onePassage', { 
        path: '/passages/:_id',
        template: 'passageItem' // <-- to be explicit
        data: function() {
            return Passages.findOne(this.params._id);
        }
    });
});

模板

您的模板如下所示:

<template name="passageItem">
    <div class="passage">
        <div class="one-passage">
            <h4><a href= "{{pathFor 'onePassage'}}">{{title}}</a></h4>
            <div class="passage-content">
                {{content}}
            </div>
        </div>
    </div>
</template>

模板中“this”的范围将设置为 Passages.findOne 选择器返回的文档。

如果模板未呈现,则意味着您正在搜索不存在的段落,或者您的段落缺少标题或内容字段。

渲染函数

现在是您问题的最后一部分。渲染函数中“this”的范围设置为模板实例。因此,如果您需要访问模板数据,请尝试以下操作:

Template.passageItem.rendered = function() {
    console.log(this.data); // you should see your passage object in the console
};

【讨论】:

  • 非常有帮助!我想我明白发生了什么。 Template.passageHighlight.rendered = function() { console.log('rendered this' + this.data); //按预期工作 Meteor.defer(function() { console.log('defered this' + this.data); //undefined.
  • 所以有效的是在延迟之前设置passageId。 Template.passageHighlight.rendered = function() { var passId = this.data._id; Meteor.defer(function() {
  • 你说得对! Meteor.defer 函数回调中“this”的范围发生了变化。
【解决方案3】:

我假设一个段落由 {'title':'', 'content':''}

那么这应该可以工作:

在 router.js 中

Router.map(function() {
  this.route('passagesList', {path: '/'});
  this.route('onePassage', { 
    path: '/passages/:_id',
    data: {
      passage: function() { return Passages.findOne(this.params._id); }
    }
  });
});

在passage-item.html中:

<template name="passageItem">
{{#each passage}}
  <div class="passage">
    <div class="one-passage">
      <h4><a href= "{{pathFor 'onePassage'}}">{{title}}</a></h4>
        <div class="passage-content">
        {{content}}
        </div>
    </div>
  </div>
{{/each}}
</template>

【讨论】:

  • 是的段落有标题、内容和 wordHighlighted,我想在 Template.passageItem.rendered 中使用来设置背景颜色。我尝试了您的建议,但它对我不起作用。我认为命名数据是我错过的,但我完全按照你所说的进行了尝试,以及 #with 和 {{> 通道项通道}} 并且所有这些我都知道这仍然是窗口。
  • 这不起作用,因为在路由器映射“数据”函数中,您使用 findOne 选择器——它返回一个对象——并在模板中使用了 {{#each}} 标记。 {{#each}} 标记需要一个集合游标或数组来迭代。
猜你喜欢
  • 1970-01-01
  • 2015-01-18
  • 2014-09-03
  • 2014-06-20
  • 1970-01-01
  • 2016-10-13
  • 2014-10-12
  • 1970-01-01
  • 2015-08-11
相关资源
最近更新 更多