2015-03-03 168 views
0

這一個問題,我以前的一個:Meteor: How to publish custom JSON dataMeteorJS:模板渲染和流星方法調用

我創建了一個流星方法構建一個複雜的JSON(與不同的集合等建)。有了這些數據,我需要使用D3.js來構建圖表。

我曾經在會話中設置數據,但當我意識到他們需要刷新每次我到達頁面時,它不能正常工作。

顯然有一些東西我沒有在機械理解,但這裏是我的代碼:

Template.myPage.rendered = function(){ 

    var data = Meteor.call('myData'); 

    var svgContainer = d3.select("#svg"); 

    var margin = 40; 
    var width = parseInt(d3.select("#svg").style('width'),10); 
    var height = parseInt(d3.select("#svg").style('height'),10); 
    // ... some more D3 code where I need the data 

我得到的錯誤是:

"Exception from Tracker afterFlush function: data is undefined 

我已經嘗試調用模板外部的Meteor方法,並將結果放入Session中(在回調函數中),但它不起作用。我也嘗試使用反應性變種,但我無法做到。

非常感謝。

回答

1

由於Twitter和@callmephilip我找到了答案(我很慚愧我找不到它自己!:D)

唯一要做的就是把所有的d3代碼放在方法回調裏面

Template.myPage.rendered = function(){ 
    Meteor.call('myData', function(err, result){ 
     if(err){ 
      console.log(err); 
     }else{ 
      // all the D3.js code 
     } 
    }); 
}; 

有一個好的一天;)

1

那麼,當您嘗試使用沒有值的變量時,會出現"undefined"錯誤。

console.log(data) //return undefined 

根據你說的話,則Meteor.method返回JSON誰依賴於其他藏品。

所以我認爲你在這裏最好的選擇是在myPage模板上使用waitOn

waitOn:function(){ 
//return all the collection that the JSON depends 
} 

您可以嘗試使用會話,也可以使用跟蹤器。

var data = Meteor.call('myData'); 
Session.set('data',data) 

//and later 

    Template.myPage.rendered = functiopn(){ 
     Tracker.autorun(function(){ 
     var data = Session.get('data') 
      if(data === undefined){ 
      //this is the long way 
      console.log("Wait the data value still undefined") 
      }else{ 
      //load all the D3 stuff 
      console.log(data) 
      } 
     }); 
    } 

GL

+0

你好,謝謝你。我無法等待所有的收藏,因爲我需要的條目太多 - 太多,無法在客戶端發送。 – jseiller 2015-03-03 15:02:34

+0

那麼使用'Session'和'tracker',火了'D3'代碼時數據的'!== undefined' – Ethaan 2015-03-03 15:03:31

+0

另外,用'Meteor.call(「MYDATA的」)問題',並將其設置在會話是,它不會更新,當我離開頁面,並回到它上面:( – jseiller 2015-03-03 15:05:05

1

我會嘗試水木清華這樣的:

Template.myPage.rendered = function(){ 
    Meteor.call('myData', function(error,data){ 
     // if !error, data should be good 
     var svgContainer = d3.select("#svg"); 

     var margin = 40; 
     var width = parseInt(d3.select("#svg").style('width'),10); 
     var height = parseInt(d3.select("#svg").style('height'),10); 
    }); 
}; 
0

,您可以使用 「流星無功法」。下面是一個內嵌鏈接https://github.com/stubailo/meteor-reactive-method

然後在客戶端

Template.myPage.rendered = functiopn(){ 
    Tracker.autorun(function(){ 
    var data = ReactiveMethod.call('myData'); 
     if(data === undefined){ 
     //this is the long way 
     console.log("Wait the data value still undefined") 
     }else{ 
     //load all the D3 stuff 
     console.log(data) 
     } 
    }); 
} 

在服務器

Meteor.methods({ 
    myData: function() { 
    return CollectionName.find().fetch() 
} 
})