2016-02-06 133 views
1

我正在使用Meteor和React。當我加載一個頁面時,Iron Router在一個集合中創建一個文檔。然後它使用Meteor.method來查找用戶的權限並將其設置在文檔上並進行更新。同時,客戶端頁面正在加載併爲集合中的文檔運行查詢。流星法clobbers訂閱查詢

看來,Meteor.method代碼正在破壞客戶端上的查詢。通過多個查詢,該文件存在,我可以console.log()它。然後突然我得到「未定義」。該文件仍然存在,因爲我可以從另一個Meteor.call查詢它。我已經使用發佈/訂閱,但客戶端無法看到它。

下面是一些我的代碼(文件合併爲簡單起見):

Editors = new Mongo.Collection('editors'); 

if (Meteor.isServer()) 
    Meteor.publish('editors', function (editorId) { 
     return Editors.find(editorId) || this.ready(); 
    }); 

    Meteor.methods({ 
     setEditorMode: function (editorId, userId) { 
      var editor = Editors.findOne(editorId); 
      var role = Roles.find({ 
       doc_id: editor.manuscriptId, 
       user_id: userId 
      }).fetch()[0]; 
      var defaultEditorMode = "readOnly"; 

      if (role !== null && role.role == 'owner' || role.role == 'contributor') { 
       defaultEditorMode = "readWriteComment"; 
      } else if (role !== null && role.role == 'reviewer') { 
       defaultEditorMode = "readComment"; 
      } 

      console.log(editor); 
      Editors.update(editor._id, { 
       $set: { 
        defaultEditorMode: defaultEditorMode, 
        editorMode: defaultEditorMode 
       } 
      }); 
      console.log(Editors.findOne(editor._id); 
     } 
    }); 
} 

if (Meteor.isClient()) { 
    Router.route('/documents/:id/edit', function() { 
     var editorId; 

     manuscriptId = this.params.id; 

     this.wait(/* Doing some work */); 

     if (this.ready()) { 
      editorId = Editors.insert({manuscriptId: manuscriptId}); 
      Meteor.call('setEditorMode', editorId, Meteor.userId()); 
      this.render('editor', { 
       data: function() { 
        return { 
         editorId: editorId 
        }; 
       } 
      }); 
     } else { 
      this.render('loading'); 
     } 
    }); 

    Editor = React.createClass({ 
     mixins: [ReactMeteorData], 

     componentWillMount: function() { 
      Meteor.subscribe('editors', this.props.editorId); 
     }, 

     getMeteorData: function() { 
      var editor, editorId; 

      editorId = this.props.editorId; 
      editor = Editors.findOne(editorId); 
      console.log(editor); 

      return { 
       editor: editor || {} 
      }; 
     }, 

     render: function() { 
      return <EditorContent editor={this.data.editor} /> 
     } 
    }); 
} 

我需要在服務器上更新,以便它可以安全地發生。我的期望是,服務器上文檔的任何更新都會傳播到客戶端。相反,一旦我在服務器上進行更新getMeteorData()被調用並且查詢返回「undefined」。

如何獲得我剛在服務器上設置的值?

+0

更新裏面我Meteor.subscribe代碼:我註釋掉在Meteor.methods更新,但我仍然得到這個問題。在進一步的測試中,我已經爲來自客戶端的文檔安排了額外的更新,但是當我從客戶端查詢(服務器仍然獲得更改)時,我從來沒有獲得除「未定義」之外的任何內容。我怎樣才能調試Meteor.subscribe? – Manuscript80

+0

我想你試過console.log你的editorId通過你的不同的組件,並確保在你的mongoDB /流星外殼的條目是正確的插入和更新。你有沒有嘗試將你的訂閱放入你的getMeteorData或者刪除|| this.ready()來自出版物?我對你的風格不熟悉,但這些是我不確定的唯一觀點。 – ko0stik

回答

0

感謝@ ko0stick,我想通了,我需要把getMeteorData