如何在模板助手中使用Meteor方法
我怎样才能定义一个Meteor方法,也可以在模板助手中调用?
我有这两个文件:
文件:lib / test.js
Meteor.methods({ viewTest : function (str) { return str; } });
文件:client / myView.js
Template.helloWorld.helpers({ txt : function () { var str = Meteor.call('viewTest', 'Hello World.'); return str; } });
当我给“str”一个正常的字符串一切工作正常。 但在这种情况下,我的模板没有得到任何价值。 我定义了 – 对于测试 – 在方法是普通函数的同一个文件中,并试图调用函数。 我得到的错误是该函数不存在。 所以我认为Meteor在知道任何关于我为它定义的方法之前都会尝试渲染模板。 但我认为这有点不同寻常 – 不是吗?
现在有一个新的方法来做到这一点(流星0.9.3.1),不会污染会话命名空间
Template.helloWorld.helpers({ txt: function () { return Template.instance().myAsyncValue.get(); } }); Template.helloWorld.created = function (){ var self = this; self.myAsyncValue = new ReactiveVar("Waiting for response from server..."); Meteor.call('getAsyncValue', function (err, asyncValue) { if (err) console.log(err); else self.myAsyncValue.set(asyncValue); }); }
在“创建的”回调中,创建ReactiveVariable的新实例(请参阅文档 )并将其附加到模板实例。
然后您调用您的方法,当回调触发时,将返回的值附加到无功变量。
然后,您可以设置您的帮助程序以返回无效变量(现在附加到模板实例)的值,并在方法返回时重新运行。
但是请注意,您必须添加reactive-var包才能工作
$ meteor add reactive-var
Sashko增加了一个叫做流星反应法的整洁小包来解决这个问题。
$ meteor add simple:reactive-method
Template.helloWorld.helpers({ txt: function() { return ReactiveMethod.call('viewTest', 'Hello World.'); } });
正如我在常见的错误中指出的那样,助手应该是无副作用的,所以我会谨慎使用这个技巧。 但是,对于以下情况,这是一个非常方便的快捷方式:
- 助手只应该触发一次(不依赖于被动状态)。
- 被调用的方法不会改变数据库。
由于请求是异步的,因此需要将返回值与Session变量连接起来:
Template.helloWorld.helpers({ txt : function () { return Session.get("txt") || "Loading"; } }); Template.helloWorld.created = function() { Meteor.call('viewTest', 'Hello World.', function(err, result) { Session.set("txt", result); }); }
所以当你的模板加载的时候应该调用一次(至少应该用流星的新版本)。
该值将被调用并显示。 否则,它会说“加载”。
客户端的方法是异步的,它们的返回值总是未定义的。 要获得方法返回的实际值,您需要提供一个回调函数:
Meteor.call('method', 'argument', function(error, result) { .... });
现在,在帮手中使用结果并不容易。 但是,您可以将其作为数据对象存储在模板中,然后将其返回给帮助器:
Template.template.created = function() { var self = this; self.data.elephantDep = new Deps.Dependency(); self.data.elephant = ''; Meteor.call('getElephant', 'greenOne', function(error, result) { self.data.elephant = result; self.data.elephantDep.changed(); }); }; Template.template.showElephant = function() { this.elephantDep.depend(); return this.elephant; };
这是预期的行为。 您没有按照预期使用methods
。
您的代码在客户端上定义了一个服务器方法viewTest
和一个相应的方法存根,名称相同。
Meteor.call('viewTest', 'Hello World.');
远程调用服务器上的viewTest
,并行运行客户端上的存根。
关于存根的返回值,请参阅这里的文档,特别是:
在客户端上,存根的返回值被忽略。 存根的运行是因为它们的副作用:它们是为了模拟服务器方法的结果,而不是等待往返延迟。
关于服务器方法的返回值,请参阅这里的文档,特别是:
在客户端,如果你没有传递一个回调,而你又不在一个存根内,那么调用将返回undefined,你将无法获得该方法的返回值。 这是因为客户端没有光纤,所以实际上没有任何方法可以阻止方法的远程执行。
@msavin有一个很好的包:
https://atmospherejs.com/msavin/fetcher