2017-03-07 155 views
0

MemberProfilesMemberPayments collections.The MemberProfile已经expiryDate场这是在insert.I设置为当前日期需要扩展设置一个触发添加到流星日期只要将MemberPayment添加到该MemberProfile中,就会显示一个唯一的MemberProfile。如何使用quickform

MemberProfiles = new Mongo.Collection('memberProfiles'); 
MemberProfileSchema = new SimpleSchema({ 
expiryDate: { 
    type: Date, 

    autoValue: function() { 

    return moment().toDate(); 
    }, 

    autoform: { 
     type: "hidden" 
    } 
} 

// to insert into Memb erProfiles 
{{> quickForm collection="MemberProfiles" id="insertMemberProfileForm"  type="insert" class="new-recipe-form"}} 

//the code for MemberPayments collection 

MemberPayments = new Mongo.Collection('memberPayments'); 

MemberPayments.before.insert(function (userId, doc) { 

let memberProfile= MemberProfiles.direct.findOne({profile: doc.memberId}); 

    MemberProfiles.update(doc.memberId, { 

    $set: { 
     expiryDate: moment().add(31, 'days'); 
, 
    } 
} 
) 

});

我加入了所有必需的包,但仍这并不干活。我得到错误无法设置的特性“expiryDate”未定义

+0

你可以编辑你的问题,并添加代码,你执行初始插入到MemberProfiles? – jordanwillis

+0

好的,我正在使用quickForm插入到MemberProfiles中。 –

+0

您是否也在使用collection2软件包? – jordanwillis

回答

1

它是具有挑战性的尝试解决这样的问题,而有一个更完整应用程序示例或github或其他地方的完整项目引用。

但是,当我通读您的代码时,我注意到您的MemberProfiles.update()函数中存在一个问题。我还注意到,看起来你只是在客户端处理你的表单(例如因为你的quickform没有使用流星方法),所以你将不得不手动调用SimpleSchema方法来生成自动值。请记住,您的客户端方法现在可能会正常工作,但是一旦您删除insecure包,您将不得不实施Meteor方法来执行插入或配置您的收集允许/拒绝规则以允许客户端插入(这是危险的)。

由于您使用的是moment.js,所以您需要小心,在存储到mongodb之前,始终从时刻对象中提取日期。在这种情况下,您试图将expiryDate设置为从moment().add(31, 'days')返回的值,这是另一个时刻对象。

此外,我会假设你想添加31天到expiryDate的当前值,但是你永远不会用expiryDate初始化时刻。因此,您将始终将expiryDate设置为该函数执行后的31天。

最后,你有一个语法错误(;$set对象中)和你的findOne选择包括{profile: doc.memberId}但是你MemberProfiles模式说,只有您的收藏在_idexpiryDate领域。

试试这个解决上述问题的新逻辑,看看能否解决您的问题。

MemberPayments.before.insert(function (userId, doc) { 
    let memberProfile = MemberProfiles.direct.findOne({profile: doc.memberId}); 

    if (memberProfile) { 
    if (!memberProfile.expiryDate) { 
     console.log("expiryDate was not previously set!"); 
    } else { 
     MemberProfiles.update({profile: doc.memberId}, { 
     $set: { 
      expiryDate: moment(memberProfile.expiryDate).add(31, 'days').toDate() 
     } 
     }); 
    } 
    } else { 
    console.log("memberProfile not found"); 
    } 
}); 

既然这是固定的,您需要解决您的自动值不会在客户端生成的问题。您可以通过调用SimpleSchema .clean()方法来完成此操作。由于您没有使用Meteor方法来处理您的quickForm(因此做所有客户端),您需要添加下面的AutoForm挂钩以确保在保存doc之前调用SimpleSchema .clean()方法(然后将执行您的autovalue逻辑)。

AutoForm.hooks({ 
    insertMemberProfileForm: { 
    before: { 
     insert: function(doc) { 
     MemberProfileSchema.simpleSchema().clean(doc); 
     return doc; 
     } 
    } 
    } 
}); 

你应该把上面的代码中onRendered()回调的模板创建您的quickform(例如包含在HTML下面的代码模板)。

{{> quickForm collection="MemberProfiles" id="insertMemberProfileForm" type="insert" class="new-recipe-form"}} 
+0

我已经将集合附加到了这两个collections.my的autoValue函数中,但是当添加MemberPayment时,特定MemberProfile的expiryDate未更新。 –

+0

@DilekaMadushan好吧,这是你从你的问题中排除的重要细节。还有什么被遗漏了吗?示例中的MemberProfile'update'代码看起来不正确。它说'days MemberProfiles.update(doc.memberId,date,{'。什么是'days'和'date'。复制粘贴错误? – jordanwillis

+0

我想添加一个月到特定memberProfile的expiryDate。这就是我 –