我的 meteor 应用程序中有以下代码
if (Meteor.isClient) {
Meteor.startup(function(){
var onSuccess = function(acceleration){
alert( acceleration);
};
var onError = function(acceleration){
return "error";
}
var options = { frequency: 3000 }; // Update every 3 seconds
var getAcc = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
});
}
它的作用是每 3 秒检索一次 Android 手机加速计数据,并且在成功轮询后,它将在警报中显示该对象。这工作得很好。
但是,我不希望这个轮询代码出现在启动函数中。我想更好地控制何时执行
我有一个模板,我想在其中显示加速度计值。我更改了上面代码中的 onSuccess
方法以返回对象而不是发出警报(其余启动代码相同):
var onSuccess = function(acceleration){
return acceleration;
};
我的模板如下所示:
Template.rawData.helpers({
acc: function(){
alert(getAcc);
return getAcc;
}
});
我期望发生的情况是将加速度计数据存储在启动函数中的 getAcc
中,然后通过 acc
将其返回到我的网页。这似乎不会发生。模板中的警报
也不会发生
有没有办法从启动功能之外访问这些cordova插件?我只是错误地返回了启动部分和模板部分之间的对象吗?
我想我的另一个首要问题是:如果这些加速度计值是在启动函数中收集的,而不是从模板助手中收集的,我不确定如何通过模板显示这些加速度计值
最佳答案
当数据发生变化时,您需要让模板使用react式更新。为此,请设置 reactive variable由回调更新。首先,安装包:
meteor add reactive-var
然后,当创建模板时,创建 react 变量并开始观察回调:
Template.rawData.onCreated(function() {
self = this;
self.rawValue = new ReactiveVar();
self.accWatchID = navigator.accelerometer.watchAcceleration(
function(acc) { self.rawValue.set(acc); }, function() {}, { frequency: 3000 }
);
});
然后,您的模板助手可以返回响应变量的值,并且您的模板将在其发生更改时更新:
Template.rawData.helpers({
acc: function() {
return Template.instance().rawValue.get();
}
});
(请注意,在您的原始代码中,由于未调用警报,因此您的模板中一定存在问题。它的名称正确吗?)
最后,您应该在模板被销毁时停止回调:
Template.rawData.onDestroyed(function() {
navigator.accelerometer.clearWatch(this.accWatchID);
});
请注意,我只是在此处键入了该代码,而没有对其进行测试。如果它不能立即工作,您可能需要对其进行一些微调。
关于Javascript/meteor android 返回对象到模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35197555/