2016-02-11 47 views
0

我開始學習流星,我確實設置了一個小型測試項目。我做了一個簡單的模板,像這樣的test.html:流星模板創建兩次後,添加accounts-ui包

<head> 

     <meta charset="utf-8"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 
     <meta name="description" content=""> 
     <meta name="author" content=""> 

     <title>Test</title> 

</head> 
<body> 

{{> TestPage}} 

</body> 
<template name="TestPage"> 
    <p>hello</p> 
</template> 

我也裝iron-router我試圖做設置的路由。然後我檢查與meteor run,一切都還好吧,我有一個簡單的頁面與一個hello文字標誌。之後,我想嘗試做簡單的登錄頁面,我添加了meteor add accounts-ui accounts-password。之後,當我嘗試加載我的頁面時,hello顯示兩次。所以我去了js部分去嘗試瞭解發生了什麼。這裏充滿test.js:

var textMessage = ""; 
var textMessageDep = new Deps.Dependency; 

var getTextMessage = function() 
{ 
    textMessageDep.depend(); 
    return textMessage; 
}; 
var setTextMessage = function (newValue) { 
    if (newValue !== textMessage) 
     textMessageDep.changed(); 
    textMessage = newValue; 
}; 
Template.TestPage.onRendered(function() { 
    console.log('on rendered'); 
}); 
Template.TestPage.onCreated(function() { 
    console.log('on created'); 
}); 

所以,我設法在JS控制檯輸出如下:

on created 
on created 
on rendered 

On created事件被稱爲出於某種原因兩次,這就是爲什麼我得到渲染模板的兩個副本。如何正確解決這個問題?我假設流星等待Meteor.Users收藏準備好了嗎?我甚至沒有添加任何用戶到這個集合。

而且這是我的路由器的配置看起來像:

Router.map(function() { 
    this.route('/', { 
     onBeforeAction: function() { 
     // here planned to add 
     // if(!Meteor.user()) {} 
     // 
       this.render('TestPage'); 
     } 

    }); 
}); 

回答

1

這是因爲你問流星呈現模板的兩倍。默認情況下,meteor將首先加載任何帶有body標籤的文件,這是您此時放置TestPage模板的文件。然後,您將onBeforeAction放入TestPage的另一個渲染中,因此,頁面上會顯示另一個TestPage。要解決這個問題的一種方法是取出一個在onBeforeAction

正確的方法指定模板在路由器渲染是

this.route('TestPage', { 
    path: '/' 
}); 

並取出一個body

+0

感謝這並幫助我在 – Vladislav