2014-03-18 61 views
0

加载的数据量淫秽我有一个加载乔布斯收集流星JS:在循环

Deps.autorun(function(){ 
    var onet = Session.get('currentIndustryOnet'); 
    var city_id = Session.get('currentMapArea'); 
    jobsSubscription = Meteor.subscribe('jobs', onet, city_id); 

    console.log(onet); 

    if(jobsSubscription.ready) { 
    Session.set('jobCount', Jobs.find().count()); 
    } 
}); 

Template.selector.events({ 
    'click div.select-block ul.dropdown-menu li': function(e) { 
    var selectedIndex = $(e.currentTarget).attr("rel"); 
    var val = $('select#industryPicker option:eq(' + selectedIndex + ')').attr('value'); 
    var oldVal = Session.get('currentIndustryOnet'); 

    if(val != oldVal) { 
     Session.set('jobsLoaded', false); 
     Session.set('currentIndustryOnet', val); 
    } 
    } 
}); 

console日志20+值什么VAR onet是一个应用程序。看起来Meteor.autorun不会运行一次。这是正常的吗?如果不是,我如何解决这个问题只能运行一次?

更新时间:

Jobs = new Meteor.Collection('jobs'); 
Cities = new Meteor.Collection('cities'); 
Pagination.style('bootstrap'); 

Session.setDefault('jobCount', null); 
Session.setDefault('jobsLoaded', false); 

Meteor.subscribe('cities'); 

Session.set('jobCount', Jobs.find().count()); 

Deps.autorun(function(){ 
    var onet = Session.get('currentIndustryOnet'); 
    var city_id = Session.get('currentMapArea'); 
    Meteor.subscribe('jobs', onet, city_id, function onReady(){ 
    Session.set('jobsLoaded', true); 
    }); 

    Session.set('jobCount', Jobs.find().count()); 
}); 

function plotCities() { 
    console.log("CITIES PLOTTING"); 
    // var jobs = Jobs.find().fetch(); 
    // var addresses = _.chain(jobs) 
    //    .countBy('address') 
    //    .pairs() 
    //    .sortBy(function(j) {return -j[1];}) 
    //    .map(function(j) {return j[0];}) 
    //    .slice(0, 50) 
    //    .value(); 

    // gmaps.clearMap(); 
    // $.each(_.uniq(addresses), function(k, v){ 
    // var addr = v.split(', '); 

    // Meteor.call('getCity', addr[0].toUpperCase(), addr[1], function(error, city){ 
    //  if(city) { 
    //  var opts = {}; 
    //  opts.lng = city.loc[1]; 
    //  opts.lat = city.loc[0]; 
    //  opts.population = city.pop; 
    //  opts._id = city._id; 
    //  gmaps.addMarker(opts); 
    //  } 
    // }); 
    // }) 
} 

Template.list.jobs = function() { 
    plotCities(); 
    return Pagination.collection(Jobs.find({}).fetch()); 
} 

console.log('CITIES PLOTTING')被要求各地在第一时间8倍,页面加载,然后如果我切换Sessioned1吨,并且作业重新加载数据,呼叫30+次

更新2:

这里是我的代码:

Session.set('jobsLoaded', false); 

Meteor.subscribe('cities'); 

Session.set('jobCount', Jobs.find().count()); 

Deps.autorun(function(){ 
    var onet = Session.get('currentIndustryOnet'); 
    var city_id = Session.get('currentMapArea'); 
    Meteor.subscribe('jobs', onet, city_id, function onReady(){ 
    Session.set('jobsLoaded', true); 
    }); 

    Session.set('jobCount', Jobs.find().count()); 
}); 

function plotCities() { 
    var jobs = Jobs.find().fetch(); 
    var addresses = _.chain(jobs) 
       .countBy('address') 
       .pairs() 
       .sortBy(function(j) {return -j[1];}) 
       .map(function(j) {return j[0];}) 
       .slice(0, 50) 
       .value(); 

    gmaps.clearMap(); 
    $.each(_.uniq(addresses), function(k, v){ 
    var addr = v.split(', '); 

    Meteor.call('getCity', addr[0].toUpperCase(), addr[1], function(error, city){ 
     if(city) { 
     var opts = {}; 
     opts.lng = city.loc[1]; 
     opts.lat = city.loc[0]; 
     opts.population = city.pop; 
     opts._id = city._id; 
     gmaps.addMarker(opts); 
     } 
    }); 
    }) 
} 

Template.list.jobs = function() { 
    if(Session.equals('jobsLoaded', true)) { 
    console.log("LOADED PLOT"); 
    plotCities(); 
    } 

    return Pagination.collection(Jobs.find({}).fetch()); 
} 

console.log("LOADED PLOT")叫...第一次加载的8倍,第二,几乎40 ...

+0

'Meteor.autorun()'?我甚至没有在文档中看到。 –

+0

对不起,错字。我的意思是'Deps.autorun()' – dennismonsewicz

回答

0

Deps.autorun重新运行每当内部使用的反应性项目被更新。你的函数中有三个这样的项目:两个会话变量和.ready()句柄。最有可能的是最后一个导致多次重新运行。如果您确定会话变量在此期间未被触及,那么这是唯一的选择。

尽管我对此不确定,但每次在订阅频道中拉取新项目时,.ready()可能会失效。因此,在您的自动运行中进行此检查会在第一批数据被拉出时导致多个初始重新运行。

移动autorun之外的检查(这可能是因为订阅从外部可见)并且应该解决问题。

 


 

啊,现在是别的东西:你调用从Template.list.jobs,这也反应plotCities并获得重新运行每次东西Jobs.find({})变化 - 如此反复,每次一次加载一个新的初始项目。

您有一个会话变量,您在其中标记您的订阅已准备就绪。用它来过滤呼叫:

Template.list.jobs = function() { 
    if(Session.equals('jobsLoaded', true)) plotCities(); 
    return Pagination.collection(Jobs.find({}).fetch()); 
} 
+0

非常感谢您对我有关Meteor的问题的所有帮助。我尝试了你的建议,但仍然打了很多电话。我已更新我的答案,以包含新代码我正在尝试 – dennismonsewicz

+0

我已更新答案。 –

+0

我不知道我在做什么错,但是这个杀了我......我用我的新代码更新了我的问题...... – dennismonsewicz