2016-09-29 55 views
0

你好,對不起我的英文破碎。如何正確使用Meteor.setInterval()和Collection.update()

我有一個方法「updateCounterState」用於在我的mongodb集合中每秒增加和更新一個數字,並在我的html文件的模板中顯示這個數字。它似乎工作,但我每次都使用這個函數兩個錯誤。三天,我試圖找出如何解決這些錯誤。由於我的異步更新,我相信我必須將這個代碼塊與Meteor.bindEnvironment-Wrapper一起使用。但是,我不知道如何使用它來修復這些錯誤。或者,也許我完全錯了,這些錯誤還有另一個原因。

EDIT#2:

客戶機/ main.html中

<head> 
    <title>test-timer</title> 
</head> 

<body> 
    {{> timeTrackerTemplate}} 
</body> 

<template name="timeTrackerTemplate"> 
    {{#each showCounterState}} 
    <p class="counter-state">{{state}}</p> 
    <button class="start-counting">Start</button> 
    {{/each}} 
</template> 

客戶機/ main.js

import { Template } from 'meteor/templating'; 

Template.timeTrackerTemplate.events({ 
    'click .start-counting': function(e) { 
     Meteor.call('updateCounterState', this._id); 
    } 
}); 

服務器/ main.js

import { Meteor } from 'meteor/meteor'; 

Meteor.startup(() => { 
    // code to run on server at startup 
}); 

methods.js(根文件夾)

Meteor.methods({ 
    'updateCounterState': function(id) { 
     Meteor.setInterval(function() { 
      TimeTracker.update(
       {_id: id}, 
       { 
        $inc: {state: 1}, 
       }, 
      ); 
     }, 1000); 
    } 
}); 

ttcollection.js(根文件夾)

TimeTracker = new Mongo.Collection('testtracker'); 

if (Meteor.isClient) { 
    Template.timeTrackerTemplate.helpers({ 
     showCounterState: function() { 
      return TimeTracker.find(); 
     } 
    }); 
} 

流星:PRIMARY> db.testtracker.find( {})

{ "_id" : ObjectId("57ee677227a0af6b59dc12ce"), "state" : 147 } 
{ "_id" : ObjectId("57ee677a27a0af6b59dc12cf"), "state" : 148 } 
{ "_id" : ObjectId("57ee6e6027a0af6b59dc12d0"), "state" : 73 } 

錯誤每次我按下一個按鈕:

Exception while simulating the effect of invoking 'updateCounterState' Error: Can't set timers inside simulations 
    at withoutInvocation (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:463:13) 
    at bindAndCatch (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:471:33) 
    at Object.setInterval (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:498:24) 
    at updateCounterState (http://localhost:3000/app/app.js?hash=f641538433c68c8f8b820f0e05cebb12531cb357:66:20) 
    at http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3973:25 
    at withValue (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1077:17) 
    at Connection.apply (http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3964:54) 
    at Connection.call (http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3840:17) 
    at Object.clickStartCounting (http://localhost:3000/app/app.js?hash=f641538433c68c8f8b820f0e05cebb12531cb357:47:20) 
    at http://localhost:3000/packages/blaze.js?hash=a9372ce320c26570a2e4ec2588d1a6aea57de9c1:3718:20 Error: Can't set timers inside simulations 
    at withoutInvocation (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:463:13) 
    at bindAndCatch (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:471:33) 
    at Object.setInterval (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:498:24) 
    at updateCounterState (http://localhost:3000/app/app.js?hash=f641538433c68c8f8b820f0e05cebb12531cb357:66:20) 
    at http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3973:25 
    at withValue (http://localhost:3000/packages/meteor.js?hash=ae8b8affa9680bf9720bd8f7fa112f13a62f71c3:1077:17) 
    at Connection.apply (http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3964:54) 
    at Connection.call (http://localhost:3000/packages/ddp-client.js?hash=27502404fad7fc072e57e8b0b6719f40d92709c7:3840:17) 
    at Object.clickStartCounting (http://localhost:3000/app/app.js?hash=f641538433c68c8f8b820f0e05cebb12531cb357:47:20) 
    at http://localhost:3000/packages/blaze.js?hash=a9372ce320c26570a2e4ec2588d1a6aea57de9c1:3718:20 

回答

0

我解決了我的錯誤。僅在服務器端調用具有集合的方法非常重要 - 尤其是沒有「不安全」的包。

if (Meteor.isServer) { 
    //Meteor.methods() 
} 
0

凡定義的updateCounterState功能?它是模板上的幫手嗎? TimeTracker集合上的允許/拒絕狀態是什麼?

編輯(更新問題後)

首先,你的方法將作爲一個參數的TimeTracker的ID,但是當你打電話給你的方法,你不通過任何東西。您應該從客戶端創建一個TimeTracker對象,然後通過它_id,或採取任何參數在功能和服務器上創建它(在這種情況下,你的方法應該返回_id來跟蹤它。

然後,把代碼中的根文件夾是不是最好的做法,您應該使用/imports文件夾,然後import { foo } from 'foo.js',或者把你的代碼/server/client

模板助手返回蒙戈光標這是沒有用的。如果你想返回一個TimeTracker,使用TimeTracker.findOne({ _id: id })這將返回對象。基本上,你應該有這樣的東西:

Template.timeTrackerTemplate.onCreated(function() { 
    this.trackerId = null; 
}); 

Template.timeTrackerTemplate.helpers({ 
    showCounterState: function() { 
    const trackerId = Template.instance().trackerId; 
    return trackerId ? TimeTracker.findOne({ _id: trackerId }).state : ''; 
    } 
}); 

Template.timeTrackerTemplate.events({ 
    'click .start-counting': function(e, instance) { 
    instance.trackerId = TimeTracker.insert({ state: 0 }); 
    Meteor.call('updateCounterState', instance.trackerId); 
    } 
}); 
+0

你好。我添加了更多的代碼。我的收藏中沒有允許/拒絕。我將我的集合放在根文件夾中 - 這樣客戶端和服務器都可以訪問這個集合。但我的客戶必須使用我的方法更新我的文檔。我刪除了流星的「不安全」軟件包,但這些錯誤仍然存​​在。 –

+0

再次感謝您的耐心等待!我創建了一個新項目,並且希望保持此示例儘可能簡單 - 不需要額外的文件夾,如/ imports或額外的模板。我相信這個錯誤與我的文件夾結構無關,或者我錯了嗎?我再次更新了我的代碼 - 這次是完整的代碼和mongo-db條目。一切正常,但每次按下按鈕時都會出現此錯誤。你能再看看我的代碼嗎?謝謝! –

相關問題