2013-08-30 31 views
1

即時通訊和MongoDB的新。 即時通訊運行流星在Win 7和即時通訊按照伊薩克斯特勒「入門Meteor.js JavaScript框架」,即時通訊堅持在第6章「授予管理員權限」 即時通訊他的代碼,但它似乎,而管理員登錄和我添加一個項目的列表項顯示的分裂seconed可能是本地緩存和服務器同步 但我在這裏做錯了什麼? 我的代碼: 客戶端:meteorjs用戶權限不與服務器同步

Meteor.subscribe('Categories'); 

Meteor.autosubscribe(function() { 
    Meteor.subscribe("listdetails", 
     Session.get('current_list')); 
}); 

Template.categories.lists = function() { 
    return lists.find({},{sort: {Category: 1}}); 
}; 

Session.set('adding_category', false); 

Template.categories.new_cat = function() { 
    return Session.equals('adding_category',true); 
}; 
Template.categories.events({ 

    'click #btnNewCat': function (e, t) { 

     Session.set('adding_category', true); 

     Meteor.flush(); 
     focusText(t.find("#add-category")); 
    }, 

    'keyup #add-category': function (e,t){ 
     if (e.which === 13) 
     { 
      var catVal = String(e.target.value || ""); 
      if (catVal) 
      { 
       lists.insert({Category:catVal,owner:this.userId}); 
       Session.set('adding_category', false); 
      } 
     } 
    }, 
    'focusout #add-category': function(e,t){ 

     Session.set('adding_category',false); 

    }, 
    'click .category': selectCategory 
}); 

/////Generic Helper Functions///// 

//this function puts our cursor where it needs to be. 
function focusText(i,val) { 
    i.focus(); 
    i.value = val ? val : ""; 
    i.select(); 

};//< -----This is the end tag for focusText() ----- 

function selectCategory(e,t){ 
    Session.set('current_list',this._id); 
} 

function addItem(list_id,item_name){ 
    if (!item_name&&!list_id) 
     return; 
    lists.update({_id:list_id}, 
     {$addToSet:{items:{Name:item_name}}}); 
} 

function removeItem(list_id,item_name){ 
    if (!item_name&&!list_id) 
     return; 
    lists.update({_id:list_id}, 
     {$pull:{items:{Name:item_name}}}); 
} 

function updateLendee(list_id,item_name,lendee_name){ 
    var l = lists.findOne({"_id":list_id , 
     "items.Name":item_name}); 
    if (l&&l.items) 
    { 
     for (var i = 0; i<l.items.length; i++) 
     { 
      if (l.items[i].Name === item_name) 
      { 
       l.items[i].LentTo = lendee_name; 
      } 
     } 
     lists.update({"_id":list_id},{$set:{"items":l.items}}); 
    } 
}; 

Template.list.items = function() { 
    if (Session.equals('current_list',null)) return null; 
    else 
    { 
     var cats = lists.findOne({_id:Session.get('current_list')}); 
     if (cats&&cats.items) 
     { 
      for(var i = 0; i<cats.items.length;i++) { 
       var d = cats.items[i]; d.Lendee = d.LentTo ? d.LentTo : 
        "free"; d.LendClass = d.LentTo ? 
        "label-important" : "label-success"; 
      } 
      return cats.items; 
     } 
    } 
};// < ---- ending bracket for Template.list.items function ---- 

Template.list.list_selected = function() { 
    return ((Session.get('current_list')!=null) && 
     (!Session.equals('current_list',null))); 
}; 
Template.categories.list_status = function(){ 
    if (Session.equals('current_list',this._id)) 
     return ""; 
    else 
     return " btn-inverse"; 
}; 
Template.list.list_adding = function(){ 
    return (Session.equals('list_adding',true)); 
}; 
Template.list.lendee_editing = function(){ 
    return (Session.equals('lendee_input',this.Name)); 
}; 

Template.list.events({ 
    'click #btnAddItem': function (e,t){ 
     Session.set('list_adding',true); 
     Meteor.flush(); 
     focusText(t.find("#item_to_add")); 
    }, 
    'keyup #item_to_add': function (e,t){ 
     if (e.which === 13) 
     { 
      addItem(Session.get('current_list'),e.target.value); 
      Session.set('list_adding',false); 
     } 
    }, 
    'focusout #item_to_add': function(e,t){ 
     Session.set('list_adding',false); 
    }, 
    'click .delete_item': function(e,t){ 
     removeItem(Session.get('current_list'),e.target.id); 
    }, 
    'click .lendee' : function(e,t){ 
     Session.set('lendee_input',this.Name); 
     Meteor.flush(); 
     focusText(t.find("#edit_lendee"),this.LentTo); 
    }, 
    'keyup #edit_lendee': function (e,t){ 
     if (e.which === 13) 
     { 
      updateLendee(Session.get('current_list'),this.Name, 
       e.target.value); 
      Session.set('lendee_input',null); 
     } 
     if (e.which === 27) 
     { 
      Session.set('lendee_input',null); 
     } 
    } 
}); 

Accounts.ui.config({ 
    passwordSignupFields: 'USERNAME_AND_OPTIONAL_EMAIL' 
}); 

服務器端:

Meteor.startup(function() { 
    Meteor.publish("Categories", function() { 
     return lists.find({owner:this.userId},{fields:{Category:1}}); 
    }); 
    Meteor.publish("listdetails", function(category_id){ 
     return lists.find({_id:category_id}); 
    }); 
}); 

兩個:

function adminUser(userId) { 
    var adminUser = Meteor.users.findOne({username:"admin"}); 
    return (userId && adminUser && userId === adminUser._id); 
} 
lists.allow({ 
    insert: function(userId, doc){ 
     return (adminUser(userId) || (userId && doc.owner === userId)); 
    }, 
    update: function(userId, docs, fields, modifier){ 
     return adminUser(userId) || _.all(docs, function(doc) { 
      return doc.owner === userId; 
     }); 
    }, 
    remove: function (userId, docs){ 
     return adminUser(userId) || _.all(docs, function(doc) { 
      return doc.owner === userId; 
     }); 
    } 
}); 

HTML:

<head> 
    <title>LendLib</title> 
</head> 

<body> 
<div style="float:right; margin-right:20px;"> 
    {{loginButtons align="right"}} 
</div> 
<div id="lendlib"> 
    <div id="categories-container"> 
     {{> categories}} 
    </div> 
    <div id="list"> 
     {{> list}} 
    </div> 
</div> 
</body> 

<template name="categories"> 
    <h2 class="title"> 
     my stuff 
    </h2> 
    <div id="categories" class="btn-group"> 
     {{#if new_cat}} 
     <div class="category"> 
      <input type="text" id="add-category" value="" /> 
     </div> 
     {{else}} 
     <div class="category btn btn-inverse" 
      id="btnNewCat">&plus;</div> 
     {{/if}} 
     {{#each lists}} 
     <div class="category btn {{list_status}}" id="{{_id}}"> 
      {{Category}} 
     </div> 
     {{/each}} 
    </div> 
</template> 

<template name="list"> 
    <ul id="lending_list"> 
     {{#each items}} 
     <li class="lending_item alert"> 
      <button type="button" class="close delete_item" 
        id="{{Name}}">×</button> 
      {{Name}} 
      {{#if lendee_editing}} 
      <input type="text" id="edit_lendee" class="span2 
pull-right" value=""/> 
      {{else}} 
      <div class="lendee pull-right label {{LendClass}}"> 
       {{Lendee}}</div> 
      {{/if}} 
     </li> 
     {{/each}} 
     {{#if list_selected}} 
     <li class="alert-success" id="btnAddItem">&plus; 
      {{#if list_adding}} 
      <input class="span4" id="item_to_add" size="32" 
        type="text"> 
      {{/if}} 
     </li> 
     {{/if}} 
    </ul> 
</template> 

回答

1

調試TR的很多後穎和失敗我固定的問題,這個問題是在服務器端,這是原來的代碼:

Meteor.startup(function() { 
    Meteor.publish("Categories", function() { 
     return lists.find({owner:this.userId},{fields:{Category:1}}); 
    }); 
    Meteor.publish("listdetails", function(category_id){ 
     return lists.find({_id:category_id}); 
    }); 
}); 

這是固定的代碼:

Meteor.startup(function() { 
    Meteor.publish("Categories", function() { 
     return lists.find({owner:Meteor.userId},{fields:{Category:1}}); 
    }); 
    Meteor.publish("listdetails", function(category_id){ 
     return lists.find({_id:category_id}); 
    }); 
}); 

注意:該變化是在第3行進行而不是所有者:this.userId - 存在哪種劑量我將其替換爲Meteor.userId

+0

'Meteor.userId'是一個函數,確定您不應該有'Meteor.userId()'而不是?但是這應該相當於'this.userId':/ –

+0

我不知道爲什麼當使用this.userId它不工作可能是一個錯誤?我真的不知道,這個配偶相當於流星全球obj,但它不是:我真的卡住了,因爲我試圖在用戶列表之間做一個sperate,目前它不工作,他們互相影響,沒有分配 –