0

Meteor プロジェクトで filepicker パッケージをロードするのに、これまであまり運がありませんでした。

私がしたこと:

$cd ~/myMeteorProject
$mrt add filepicker
>>>Done installing smart packages
$head smart.json
>>>{
  "packages": {
  "router": {},
  "filepicker": {}
 }
}
$mrt
>>>Stand back while Meteorite does its thing

Done installing smart packages

Ok, everything's ready. Here comes Meteor!

[[[[[ ~/myMeteorProject ]]]]]

=> Meteor server running on: http://localhost:3000/

したがって、この時点では、すべてが私が期待しているように見えます。( filepicker パッケージの内容を再確認したところ、期待どおりの内容がすべて含まれており、読み込むソースの URL が filepicker.io サイトにあるものと同じであるなど)。

ただし、次を実行しようとすると(coffeescriptからコンパイルされます):

if (Meteor.isClient) {
   Meteor.startup(function() {
   return filepicker.setKey('A9FiXXdu5RB^GYujfDPwlz'); //not my actual key, don't worry
 });}

私は得る: Uncaught ReferenceError: filepicker is not defined

だから、それはちょっと残念です。何か案は?coffeescript と filepicker の両方を削除して再度追加しようとしました。ロードオーダーの問題はありますか?スクリプトの読み込みに失敗した場合、filepicker-load.js にアラートが表示されることに注意してください。これは表示されていません...

4

3 に答える 3

2

私はまったく同じ問題を抱えていましsetTimeout()setInterval()

Ink 自体がdocsで優れたノンブロッキング スクリプトを提供しており、完全にロードされるまですべてのファイルピッカー呼び出しをキューに入れ、呼び出された順に実行します。これがどのように機能するかです:

  1. mrt remove filepicker(追加された場合)
  2. mrt remove loadpicker(追加された場合)
  3. 新しいファイルを作成/lib/filepicker.js

/lib/filepicker.js

if (Meteor.isClient) {
    (function(a) {
        if (window.filepicker) {
            return
        }
        var b = a.createElement("script");
        b.type = "text/javascript";
        b.async = !0;
        b.src = ("https:" === a.location.protocol ? "https:" : "http:") + "//api.filepicker.io/v1/filepicker.js";
        var c = a.getElementsByTagName("script")[0];
        c.parentNode.insertBefore(b, c);
        var d = {};
        d._queue = [];
        var e = "pick,pickMultiple,pickAndStore,read,write,writeUrl,export,convert,store,storeUrl,remove,stat,setKey,constructWidget,makeDropPane".split(",");
        var f = function(a, b) {
            return function() {
                b.push([a, arguments])
            }
        };
        for (var g = 0; g < e.length; g++) {
            d[e[g]] = f(e[g], d._queue)
        }
        window.filepicker = d
    })(document);
    filepicker.setKey(YOUR_FILEPICKER_KEY);
}

このクライアント コードは、 https://developers.inkfilepicker.com/docs/web/から取得したノンブロッキング ローダーのバニラ バージョンです。これを使用すると、一度キーを設定すると、ファイルピッカーが既に読み込まれているかどうかを気にすることなく、好きなように使用できます。

もちろん、これで loadpicker を変更することもできます。このコードを loadpicker.js に貼り付けるだけです。

loadpicker.js

loadPicker = function(key) {
    (function(a) {
        if (window.filepicker) {
            return
        }
        var b = a.createElement("script");
        b.type = "text/javascript";
        b.async = !0;
        b.src = ("https:" === a.location.protocol ? "https:" : "http:") + "//api.filepicker.io/v1/filepicker.js";
        var c = a.getElementsByTagName("script")[0];
        c.parentNode.insertBefore(b, c);
        var d = {};
        d._queue = [];
        var e = "pick,pickMultiple,pickAndStore,read,write,writeUrl,export,convert,store,storeUrl,remove,stat,setKey,constructWidget,makeDropPane".split(",");
        var f = function(a, b) {
            return function() {
                b.push([a, arguments])
            }
        };
        for (var g = 0; g < e.length; g++) {
            d[e[g]] = f(e[g], d._queue)
        }
        window.filepicker = d
    })(document);
    filepicker.setKey(key)
};

これがうまくいくことを願っています!

于 2013-09-10T10:57:39.610 に答える
1

あなたの構文は見栄えがよく、アプリで使用するものと一致します-ファイルピッカーはスクリプト要素を挿入してスクリプトをロードするため、タイミングの問題があると思います(スクリプトがロードされる前に setKey を呼び出します)

ユーザーが何かをするまで、キーの設定を保留するかもしれません。

filepicker.setKey("KEY");
filepicker.pickAndStore({...},function(error){...});

またはタイムアウトで設定します

Meteor.setTimeout(function(){
  filepicker.setKey("KEY");
},1000);

必要に応じて間隔を使用してチェックすることもできます(長いロード時間に対する許容度が高くなります)-これを調整して、一定の時間が経過するとあきらめることができます

var filepickerInterval = Meteor.setInterval(function(){
   if(filepicker){
     Meteor.clearInterval(filepickerInterval);
     filepicker.setKey("KEY");
   }
}, 100);
于 2013-06-20T18:36:36.760 に答える
0

また、非同期 JavaScript スニペットを使用して、スクリプトが読み込まれるまで、filepicker オブジェクトへの呼び出しを自動キューに入れることもできます。https://developers.inkfilepicker.com/docs/web/#javascriptを参照してください

于 2013-06-20T20:36:50.317 に答える