在Meteor中重用或重新创build被动源是否更好?

我有一个叫“联系人”的模板。 里面是一个渲染模板“contact”的#each。 用户可以按下“编辑”button,用编辑行的mongo id设置会话variables。 该行然后被动地重新渲染成“编辑”模式。

Template.contact.viewEditing = function() { return Session.get("contactViewEditingId") === this._id; } 

html使用viewEditing助手几次,例如:

 {{#if viewEditing}} <div class="panel-heading">EDITING!</div> {{/if}} 

我需要在.rendered()中绑定一些javascript。 我想再次检查我们是否正在编辑。 我可以想到2个选项:

  1. 我应该在我的template.rendered()里面调用Template.content.viewEditing()吗? 这是否节省react native计算?
  2. 或者我应该只复制面食if语句。 这个选项似乎违反了DRY。

选项1:

 Template.contact.rendered = function() { if( Template.contact.viewEditing.call(this.data) ) { // Bind some fancy jQuery bindEditInPlace(this.data); } } 

选项2:

 Template.contact.rendered = function() { if( Session.get("contactViewEditingId") === this._id ) { // Bind some fancy jQuery bindEditInPlace(this.data); } } 

我认为在你的模板中多次放置{{viewEditing}}不会“额外花费”任何东西。 所以在逻辑上我会认为在其他地方使用这个帮手是更好的。 也许我需要更多的帮助了解react native计算。 谢谢!

助手在Deps.Computation中运行,这意味着每次在助手中引用和修改一个被动variables时,它都将重新运行。

Template.rendered是一个callback函数,每次模板被重新渲染(通常在模板中的helper被反向运行时发生),但它本身不是一个被动计算。

所以使用模板助手或者在渲染的callback中复制它的代码并不重要:两种方法都不会触发被动计算失效,因为我们不在一个里面。

就DRY而言,你可以像这样重构你的代码:

 function isContactViewEditing(contactView){ return Session.equals("contactViewEditingId",contactView._id); } Template.contact.helpers({ viewEditing:isContactViewEditing }); Template.contact.rendered=function(){ if(isContactViewEditing(this.data)){ // } }; 

我认为saimeunt的答案是正确的,特别是如果你有更复杂的逻辑在你不想复制的function。

创build一个本地函数,您可以在助手和.renderedcallback中重用。

如果你有一个情况,你想使用一个被动源减去react native,你可以通过将它包装在一个Deps.nonreactive函数中来使它无响应,如下所示:

 Deps.nonreactive(function(){ //Reactive stuff here }); 

关于react native问题,注意他从使用Session.get到Session.equals的改变。 Session.get会导致任何被动计算,用来重新计算每次会话variables的变化。 所以如果你在多个不同id的地方使用这个助手,并且改变会话variables,那么每一个都会重新计算和重新渲染它们所使用的模板。当相等性改变时,Session.equals只会使计算无效。 所以,如果将会话variables从一个不相等的id改为另一个不相等的id,在使用Session.equals时不会导致计算/模板重新运行。

对于助手只返回Session.equals结果的具体示例,您可以考虑创build一个全局的handlebars助手,可以为您使用任何会话variables和任何值。 如下所示。

 Handlebars.registerHelper('sessionEquals', function (key, value) { return Session.equals(key, value); }); 

然后在模板中使用它像这样:

 {{#if sessionEquals 'contactViewEditingId' _id}} <div class="panel-heading">EDITING!</div> {{/if}} 

在呈现可编辑项目的模板中,添加唯一类名称以将项目标记为可编辑。 然后在你的Template.renderedcallback时绑定的JavaScript使用一个select器,寻找该类,只绑定到具有该特殊类的元素。