gpt4 book ai didi

meteor - meteor -如何在模板的辅助对象和事件之间传递数据?

转载 作者:行者123 更新时间:2023-12-04 13:23:16 25 4
gpt4 key购买 nike

我对Meteor有点陌生,而我遇到的问题是 react 性数据-特别是在需要根据鼠标或键盘事件更改显示的数据的情况下。用普通的js方式执行此类操作似乎给 meteor 带来了麻烦,因为我更改的所有内容都会重新渲染并不断重置。

所以,我想我是否可以在这种情况下使用 meteor 的Deps对象,但是我不太了解它。这是我正在使用的代码:

(function(){

var tenants = [];
var selectedTenant = 0;

var tenantsDep = new Deps.Dependency;

Template.tenantsBlock.tenantsList = function()
{
tenants = [];
var property = $properties.findOne({userId: Meteor.userId(), propertyId: Session.get('property')});
var tenancies = _Utils.resolveTenancies(property, true, null, true);

for(var i = 0; i < tenancies.length; i++)
{
if(tenancies[i].tenancyId == Session.get('tenancy'))
{
tenants = tenants.concat(tenancies[i].otherTenants, tenancies[i].primaryTenant);
}
}

tenants[selectedTenant].selected = 'Selected';

tenantsDep.changed();

return tenants;
};

Template.tenantsBlock.onlyOneTenant = function()
{
tenantsDep.depend();

return tenants.length > 1 ? '' : 'OneChild';
};

Template.tenantsBlock.phoneNumber = function()
{
tenantsDep.depend();

for(var i = 0; i < tenants[selectedTenant].details.length; i++)
if(_Utils.getDynamicContactIconClass(tenants[selectedTenant].details[i].key) == 'Phone')
return tenants[selectedTenant].details[i].value;

return null;
};

Template.tenantsBlock.emailAddress = function()
{
tenantsDep.depend();

for(var i = 0; i < tenants[selectedTenant].details.length; i++)
if(_Utils.getDynamicContactIconClass(tenants[selectedTenant].details[i].key) == 'Email')
return tenants[selectedTenant].details[i].value;

return null;
};

Template.tenantsBlock.addedDate = function()
{
tenantsDep.depend();
return _Utils.timeToDateString(tenants[selectedTenant].created);
};

Template.tenantsBlock.events({
'click .Name': function(e, template)
{
tenantsDep.depend();
var _this = e.currentTarget;
var tenantName = _this.innerHTML;

$(_this).addClass('Selected');
$(_this).siblings().removeClass('Selected');

for(var i = 0; i < tenants.length; i++)
{
if(tenants[i].name == tenantName)
tenants[i].selected = "Selected";
else
tenants[i].selected = '';
}
}
})


})();

^这似乎是他们在陨星文档( http://docs.meteor.com/#deps_dependency)中获取的dependency.changed()和dependency.depend()的内容,但所有这些却给了我无限循环。

因此,我可以修改声明deps的方式来使它使数据具有响应性吗?有没有更好的方法可以一起完成这些工作?

更新:

尽管我对此表示怀疑,但我一直倾向于尝试以本地化方式使用Session.set/Session.get。所以,下次我必须这样做时,我会做
Session.set('tenantsBlock' {tenants: [], selectedTenant: 0});

然后只需从与Template.tenantsBlock相关的助手和事件映射中访问此变量即可。这样,他们都可以实时访问数据,并且在数据更改时都可以重新运行。这是我将此脚本转换成的内容(抱歉,它们都太大了):
(function()
{
Template.tenantsBlock.created = Template.tenantsBlock.destroyed =function()
{
_Utils.setSession('tenantsBlock', {
tenants: [],
selectedTenant: 0
})
};

Template.tenantsBlock.tenantsList = function()
{
var localContext = Session.get('tenantsBlock');
localContext.tenants = [];
var property = $properties.findOne({userId: Meteor.userId(), propertyId: Session.get('property')});
var tenancies = _Utils.resolveTenancies(property, true, null, true);

for(var i = 0; i < tenancies.length; i++)
{
if(tenancies[i].tenancyId == Session.get('tenancy'))
{
localContext.tenants = localContext.tenants.concat(tenancies[i].otherTenants, tenancies[i].primaryTenant);
break;
}
}

localContext.tenants[localContext.selectedTenant].selected = 'Selected';
Session.set('tenantsBlock', localContext);

return localContext.tenants;
};

Template.tenantsBlock.onlyOneTenant = function()
{
var localContext = Session.get('tenantsBlock');
return localContext.tenants.length > 1 ? '' : 'OneChild';
};

Template.tenantsBlock.phoneNumber = function()
{
var localContext = Session.get('tenantsBlock');
for(var i = 0; i < localContext.tenants[localContext.selectedTenant].details.length; i++)
if(_Utils.getDynamicContactIconClass(localContext.tenants[localContext.selectedTenant].details[i].key) == 'Phone')
return localContext.tenants[localContext.selectedTenant].details[i].value;

return null;
};

Template.tenantsBlock.emailAddress = function()
{
var localContext = Session.get('tenantsBlock');
var selectedTenantDetails = localContext.tenants[localContext.selectedTenant].details;

for(var i = 0; i < selectedTenantDetails.length; i++)
if(_Utils.getDynamicContactIconClass(selectedTenantDetails[i].key) == 'Mail')
return selectedTenantDetails[i].value;

return null;
};

Template.tenantsBlock.addedDate = function()
{
var localContext = Session.get('tenantsBlock');
return _Utils.timeToDateString(localContext.tenants[localContext.selectedTenant].created);
};

Template.tenantsBlock.events({
'click .Name': function(e, template)
{
var localContext = Session.get('tenantsBlock');
var _this = e.currentTarget;
var tenantName = _this.innerHTML;

for(var i = 0; i < localContext.tenants.length; i++)
{
if(localContext.tenants[i].name == tenantName)
{
localContext.tenants[i].selected = 'Selected';
localContext.selectedTenant = i;
}
else
{
localContext.tenants[i].selected = '';
}
}

Session.set('tenantsBlock', localContext);
}
})

})();

最佳答案

您必须克服传统的做法:) meteor 比您想象的要简单得多。 一个好的经验法则是,如果您使用jQuery操作任何DOM元素,则可能做错了。 此外,如果要访问任何数据而不使用collection API,最好有充分的理由这样做。

就您而言,您根本不需要编写任何手动依赖项。在大多数Meteor应用程序中,很少需要手动依赖。

您需要做的第一件事是将所有租户放入Meteor.Collection中,这将使他们更容易使用。

Tenants = new Meteor.Collection("tenants");

您的 tenantsBlock模板应如下所示(对一些不同的html元素进行模运算):
<template name="tenantsBlock">
<ol>
{{#each tenants}}
<li class="name {{selected}}">
<span>Primary Tenant: {{primaryTenant}}</span>
<span>Other Tenants: {{otherTenants}}</span>
<span>Phone Number: {{phoneNumber}}</span>
<span>Email Address: {{emailAddress}}</span>
<span>Added Date: {{addedDate}}</span>
</li>
{{/each}}
</ol>
</template>
Tenants中的每个文档应类似于以下内容:
{
primaryTenant: "Joe Blow",
otherTenants: "Mickey Mouse, Minnie Mouse",
phoneNumber: "555-234-5623",
emailAddress: "joe.blow@foo.com",
addedDate: "2005-10-30T10:45Z"
}

然后,您需要的所有代码仅用于选择/取消选择,您可以删除其他所有内容:

Template.tenantsBlock.tenants = function() {
return Tenants.find();
};

Template.tenantsBlock.selected = function() {
return Session.equals("selectedTenant", this._id);
};

Template.tenantsBlock.events({
'click .name': function(e) {
Session.set("selectedTenant", this._id);
}
});

我再次重申,在使用Meteor时,您永远不应使用Javascript进行DOM操作。您只需更新数据即可,如果一切操作正确,模板也会相应地进行更新。声明 您希望数据看起来如何,然后更改数据并观看魔术。

关于meteor - meteor -如何在模板的辅助对象和事件之间传递数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18879462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com