проблема с загрузкой скрипта сборщика файлов в метеоре

Мне пока не очень везет с загрузкой пакета сборщика файлов в моем проекте Meteor.

Что я сделал:

$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: сборщик файлов не определен

Так что это какой-то облом. Есть идеи? Я попытался удалить и повторно добавить как coffeescript, так и сборщик файлов. есть ли какая-то проблема с порядком загрузки? Я отмечаю, что у filepicker-load.js есть предупреждение, если скрипт не загружается, чего я не вижу...


person Ben    schedule 20.06.2013    source источник


Ответы (3)


ваш синтаксис выглядит хорошо и соответствует тому, что я использую в своем приложении - я думаю, что, поскольку сборщик файлов загружает скрипт, вводя элемент скрипта, у вас есть проблема с синхронизацией (вызов 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);
person nate-strauser    schedule 20.06.2013
comment
да, в том-то и дело. Добавил вот такую ​​функцию и теперь ошибка исправлена. - person Ben; 21.06.2013
comment
Нейт, могу ли я поместить последнюю функцию (filepickerInterval) внутрь функции Meteor.startup()? И @Ben, какую функцию из трех ты выбрал? - person Free Lancer; 09.09.2013
comment
я использую первый вариант, я отображаю обычную кнопку/ссылку, затем, когда пользователь щелкает, я устанавливаю ключ выбора файла и вызываю соответствующий метод (обычно pickAndStore) для меня - person nate-strauser; 09.09.2013

У меня была точно такая же проблема, и для меня не работало ни setTimeout(), ни setInterval().

Сами Ink предоставляют отличный неблокирующий скрипт в своих документах, который ставит в очередь все вызовы сборщика файлов до тех пор, пока не полностью загружается, а затем выполняет их в том порядке, в котором они были вызваны. Вот как это работает:

  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)
};

Надеюсь, что это работает для вас!

person Moritz Walter    schedule 10.09.2013

Вы также можете использовать асинхронный фрагмент javascript для автоматической постановки в очередь вызовов объекта сборщика файлов до тех пор, пока скрипт не загрузится. См. https://developers.inkfilepicker.com/docs/web/#javascript.

person brettcvz    schedule 20.06.2013