如果应用程序刷新,Meteor订阅不会设置复选框

时间:2014-09-26 18:53:13

标签: meteor

我遇到问题,Meteor订阅没有在刷新后设置复选框“已选中”。基本上,如果我运行Meteor并更改JS,应用程序将按预期工作(从Meteor.user()中提取数据并相应地设置复选框)。但是,如果我刷新应用程序,则所有复选框都设置为false。我不明白为什么会这样,任何想法?

我的订阅如下:

服务器侧

Meteor.publish("user-preferences", function () {
    if (this.userId) {
        return Meteor.users.find({_id: this.userId},
            {fields: {'notification': 1}});
    } else {
        this.ready();
    }
});

客户端:

Meteor.subscribe("user-preferences", function() {
    if (Meteor.user()) {
        var notification = Meteor.user().notification;
        // Check to see if notification and systems exists; if not, default to TRUE
        if (notification) {
            Session.set('aNotificationPreference', notification.hasOwnProperty('a') ? notification.a : true);
        }
        else {
            Session.set('aNotificationPreference', true);
        }
    }
    else {
        // TRUE too if no user yet
        Session.set('aNotificationPreference', true);
    }
});

这是帮助者,它会查找会话变量以使事情变得反应性:

Template.preferences.helpers({
    isChecked: function() {
        console.log('#### PREF INITIAL: ' + Session.get("aNotificationPreference"));
        var pref = Session.get("aNotificationPreference");
        if (typeof pref === 'undefined') {
            Meteor.setTimeout(function() {
                pref = Session.get("aNotificationPreference");
                console.log('#### PREF IN TIMEOUT: ' + pref);
                return pref ? 'checked' : false;
            }, 1250);
        }
        else {
            console.log('#### PREF in ELSE: ' + pref);
            return pref ? 'checked' : false;
        }
    }
});

最后,这是HTML复选框字段:

<input type="checkbox" data-role="flipswitch" data-theme="b" name="aNotificationSwitch" id="aNotificationSwitch" data-mini="true" checked={{isChecked}}>

这是基于Blaze documentation这个具体的和我发现的其他帖子。

我知道这个问题在帮助器中,但我不确定如何解决它。失败日志显示如下:

Application Cache Checking event (index):1
Application Cache NoUpdate event (index):1
#### PREF INITIAL: undefined index.js?8b2a648142fb63b940f4fb04771d18f25b5bf173:63
Connected to Meteor Server. index.js?8b2a648142fb63b940f4fb04771d18f25b5bf173:37
#### PREF INITIAL: true index.js?8b2a648142fb63b940f4fb04771d18f25b5bf173:63
#### PREF in ELSE: true index.js?8b2a648142fb63b940f4fb04771d18f25b5bf173:73
Connected to Meteor Server. index.js?8b2a648142fb63b940f4fb04771d18f25b5bf173:37
#### PREF IN TIMEOUT: true 

2 个答案:

答案 0 :(得分:0)

我还不是Meteor的专家。

但我会改变你的JavaScript:

if(Meteor.isClient){

  Template.preferences.helpers({
    isChecked: function() { return Meteor.user().notification ? 'checked' : false; }
  });

  Template.preferences.events({
    'click #aNotificationSwitch': function(event){
      var checked = event.target.checked; // true or false
      Meteor.users.update({_id: Meteor.userId()}, $set: {notification: checked});
    }
  });
}

但这与你的方法不同。通过这种方式,您不需要使用会话变量。

允许更新用户:

Meteor.users.allow({
  update: function(userId, user){
    return user._id == userId;
  }
});

答案 1 :(得分:0)

我找到的最佳解决方案是通过在Template.body.events的面板开放事件中执行以下操作,使用jQueryMobile设置flipswitch:

'panelbeforeopen #mypanel': function() {
    //Refresh flipswitches prior to opening sidepanel otherwise they default to disabled
    $("#aNotificationSwitch").flipswitch("enable").flipswitch("refresh");
    $("#bNotificationSwitch").flipswitch("enable").flipswitch("refresh");
    $("#cNotificationSwitch").flipswitch("enable").flipswitch("refresh");

}