如何使用meteor.js在特定模板的主体上获得onload函数?

时间:2014-03-26 00:36:35

标签: meteor meteorite

我正在尝试为某个模板获取以下行为:

<body onload="someInitFunction();">

假设我有以下标记(我使用mrt路由器,而不是铁路由器,用于{{renderPage}}):

// Main Template
<head>
  <title>meteorite-knowviz</title>
</head>

<body>
  {{> header}}

  <div class="container-fluid">
    <div class="row">
      {{renderPage}}
    </div>
  </div>

  {{> footer}}
</body>

该renderPage是第二个模板:

<template name="secondTemplate">
  {{#if currentUser}}
    <div class="col-md-2">
      <div class="list-group">
        <a class="list-group-item" href="{{render thirdTemplate please...}}">Third Template</a>
        <a class="list-group-item" href="{{render fourthTemplate please...}}">Fourth Template</a>
      </div>
    </div>

    // In this case let's say thirdTemplate gets rendered
    {{render the choice taken above please...}}

  {{/if}}
</template>

在这个模板中,根据点击的链接,(在这种情况下是第三个),最终会有第三个模板,它将通过javascript框架显示数据可视化,这将需要a <body onload="initFunction();">以显示数据:

<template name="thirdTemplate">
  <div class="col-md-5">
    <h2>THIS!! section needs a "<body onload="initFunction();"> in order to work" ></h2>
  </div>

  <div class="col-sm-5">
    <h2>Some other related content here</h2>
  </div>  
</template>

总结一下,我有三个问题:

1a上。我怎么能得到第三个模板来获得<body onload="initFunction();">

2a上。我可以通过哪种方式在secondTemplate中呈现不同的模板?

2B。我可以在此模板中使用{{renderPage}},即使此模板是主模板中的renderPage,还是应该以其他方式执行?

3 个答案:

答案 0 :(得分:1)

为了获得<body onload="initFunction();">,我必须执行以下操作:

首先将以下函数添加到客户端文件夹中的.js文件中:

Template.thirdTemplate.rendered = function() { // Template.thirdTemplate.created - also worked.
  $('body').attr({
    onload: 'init();'
  });
}

然而,这给我一个错误,说没有定义initFunction。在标准的html页面中,我可以正常工作,但在流星中我不得不改变我的功能:

function initFunction(){
  //what ever i wished to do 
}

要:

init = function() {
  //what ever i wished to do
}

关于页面的渲染,由于路由器的添加不再在开发中,因此铁路由是可行的。

答案 1 :(得分:0)

  

1a上。我怎么能得到第三个模板来获得<body onload="initFunction();">

你可能想在渲染第三个模板时调用initFunction,所以只需在渲染的回调中调用它。

Template['thirsTemplate'].rendered = function(){
    initFunction()
}
  

2a上。我可以通过哪种方式在其中呈现不同的模板   secondTemplate?

     

2B。即使这样,我可以在此模板中使用{{renderPage}}吗?   template是主模板中的renderedPage,或者我应该在中   其他方式?

侦听链接上的点击,当有人发生时,您手动渲染所需的模板(如果需要反应,可以使用Meteor.render)并将其添加到文档中的右侧节点。请参阅this question

可能用路由器实现(我不知道那个包)。

答案 2 :(得分:0)

我认为您要使用的是created回调,每次创建模板时都会调用它,而不是rendered回调,每次更改时都会调用导致模板重新渲染。

Template.thirdTemplate.created = function(){
    initFunction()
}

有关其他类型回调的模板,请参阅文档:http://docs.meteor.com/#templates_api