2017-06-16 61 views
0

我在流星,並已在我的項目中使用Reactive Var,沒有任何問題。在當前的例子中,我不確定是否需要使用ReactiveDict,因爲我沒有與ReactiveVar進行反應。何時使用ReactiveDict vs ReactiveVar

我將reactiveVar的值設置爲導致產生對象數組的mongo查詢。在陣列中

Template.MasterList.onCreated(function() { 
    this.teacherList = new ReactiveVar(''); 
}); 

Template.MasterList.onRendered(function() { 
    var weekNum = Session.get('CurrentWeek').substr(0, 1); 
    var week = 'Week' + weekNum; 
    var query1 = {}; 
    query1[week] = { $in: ['JC', 'JF', 'F']}; 
    this.teacherList.set(Programs.find({ $and: [{ CampYear: Session.get('GlobalCurrentCampYear') }, query1]}, { sort: { FullName: 1 }}).fetch()); 
}); 

一個物體看起來像:

{ ... 
    Students: { 
    Week1: { 
     Monday: ['Joe', 'Mary'] 
    }, 
    Week2: {}, 
    Week3: {} 
    } 
    ... 
} 

一個數組中的對象可能會更改爲類似:

{ ... 
    Students: { 
    Week1: { 
     Monday: ['Joe', 'Mary', 'Bill'] 
    }, 
    Week2: {}, 
    Week3: {} 
    } 
    ... 
} 

當變化的一個對象發生時,reactiveVar不會看到數組中的更改以重新激發幫助程序。是否在此使用ReactiveDict?

編輯:

輔助功能:

saturdayTeacher: function (name) { 
    var weekNum = Session.get('CurrentWeek').substr(0, 1); 
    var week = 'Week' + weekNum; 
    var teachers = Template.instance().teacherList.get(); 
    for (var i = 0, len = teachers.length; i < len; i++) { 
    if (_.contains(teachers[i].Students[week].Saturday, name)) { 
     Meteor.defer(function() { 
     i = 0; 
     }); 
     var teacher = teachers[i].FullName.split(' '); 
     return teacher[0] + " " + teacher[1].slice(0, 1); 
    } 
    } 
}, 
+0

這可能有幫助https://stackoverflow.com/questions/33510951/meteor-reactivevar-vs-reactivedict –

回答

1

什麼可以幫助你在一個非常簡單的方法,就是自動運行添加到您的onRendered-功能,在這裏您將ReactiveVar。因爲onRendered-Function只執行一次。當我理解正確時,您想要聽取光標上的變化,Session.get('CurrentWeek')Session.get('GlobalCurrentCampYear')

那麼試試這個:

Template.MasterList.onRendered(function() { 
 
    var self = this; 
 
    this.autorun(function() { 
 
    var weekNum = Session.get('CurrentWeek').substr(0, 1); 
 
    var week = 'Week' + weekNum; 
 
    var query1 = {}; 
 
    query1[week] = { $in: ['JC', 'JF', 'F']}; 
 
    self.teacherList.set(Programs.find({ $and: [{ CampYear: Session.get('GlobalCurrentCampYear') }, query1]}, { sort: { FullName: 1 }}).fetch()); 
 
    }); 
 
});

比將執行所有的時間查詢或會話值的結果而改變。

+0

謝謝。這工作。但我不理解它。 Session.get('GlobalCurrentCampYear')和Session.get('CurrentWeek')的兩個會話沒有改變。所以看起來,如果這些反應性來源發生變化,自動運行只會重新運行。那麼如果Sessions沒有改變,那麼'this.autorun'如何重新運行呢? –

+0

哦,我明白了。它從查詢中重新運行。 –

+0

你說得對,這是因爲查詢是被動的。 – PhilippB

相關問題