2017-03-07 151 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。這就是我 –