2016-01-27 14 views
0

對流星來說,我對整個客戶端/服務器的東西感到很尷尬。超好玩。如何獲取Meteor中的模板文件列表?

我想要讀取文件夾中所有文件的列表,並將它們打印在UI上的模板上。它必須是可能的。這是代碼。

js文件:

var availableFiles = []; 
if (Meteor.isServer) { 
    var fs = Npm.require('fs'); 
    availableFiles = fs.readdirSync(process.env.PWD + '/public/uploads'); 
    console.log(availableFiles); 
} 

Router.map(function() { 

    this.route('home', { 
     path: '/', 
     template: 'home', 
     data: {files: availableFiles} 
    }); 
}); 

HTML文件:

<template name="home"> 
{{#each data.files}} 
    {{this}} 
{{/each}} 
</template> 

我試圖把FS上的路由定義數據的函數調用裏面,但我得到「NPM不定義「錯誤。我不知道這是應該如何結構化,請記住,newb在這裏。任何幫助將不勝感激。

+0

從應用程序根目錄內的目錄中讀取內容非常棘手(並且始終詢問)。問題在於,當你部署時,目錄結構會改變。無論如何,解決這個問題的一個更好的辦法是在用戶上傳任何東西時寫入集合。然後你可以讀取集合而不是目錄。 –

+0

我實際上通過使用process.env.PWD變量擺脫了這個問題,並以這種方式獲得正確的目錄。我沒有通過這個應用程序上傳,這些文件相當大,並放置在「上傳」(非常名)的文件夾進行處理。我也不希望每次文件更改時都要向數據庫寫入單個列表,這很痛苦。 – blacktone

回答

0

我可能會做一個反應陣列(http://reactivearray.meteor.com/)和Meteor方法。類似於:

if (Meteor.isServer) { 
    var fs = Npm.require('fs'); 
    Meteor.methods({ 
     getFiles() { 
      return fs.readdirSync(process.env.PWD + '/public/uploads'); 
     } 
    }); 
} 

if(Meteor.isClient) { 
    Template.home.onCreated(function() { 
     Template.instance().files = new ReactiveArray(); 
     Meteor.call('getFiles', function(error, result) { 
      if(error) { 
       console.log(error); 
      } else { 
       Template.instance().files = files.concat(result); 
      } 
     }); 
    }); 
    Template.home.helpers({ 
     files() { 
      return Template.instance().files.array(); 
     } 
    }); 
} 

Router.map(function() { 

    this.route('home', { 
     path: '/', 
     template: 'home', 
     data: {files: availableFiles} 
    }); 
}); 

語法可能不完美,但這應該可以得到滿足。您還需要將模板更改爲{{#each files}}

相關問題