2015-09-29 3 views
0

Я пытаюсь проверить (в помощнике шаблона), если изображение существует - по заданному URL-адресу.Получить доход от вложенной функции

Если файл существует, я хочу установить пробел для этого URL-адреса. Если это не exsist, необходимо вернуть другой URL-адрес.

Моя проблема заключается, чтобы получить возврат из-за onload-/OnError-функции:

Template.backgroundImage.helpers({ 
    image: function() { 
     var url = '/background/'+file+'.jpg'; 

     var img = new Image(); 
     img.onload = function() { return url; } 
     img.onerror = function() { return '/background/image.jpg'; } 
     img.src = url; 
    } 
}); 

<template name="backgroundImage"> 
    <img src="{{image}}"> 
</template> 
+1

Используйте 'Session' для установки пути' image' – Tushar

+0

@Tushar: perfect. Спасибо за идею. – user3142695

ответ

0

Вы можете использовать Обещание:

Template.backgroundImage.helpers({ 
    image: function() { 
    return new Promise(function(resolve) { 
     var img = new Image(); 
     var url = '/background/' + file + '.jpg'; 
     img.addEventListener('load', function() { resolve(url); }); 
     img.addEventListener('error', function() { resolve('/background/image.jpg'); }); 
     img.src = url; 
    }); 
    } 
}); 
+0

Помогают ли метеорные шаблоны обещания, полученные от помощников? – jfriend00

+0

@ jfriend00 это действительно хороший вопрос! – Buzinas

0

Вы можете использовать шаблон onRendered обратного вызова для обновления ваше изображение SRC при ошибке:

Template.backgroundImage.helpers({ 
    image: function() { 
     return '/background/'+file+'.jpg'; 
    } 
}); 

Template.backgroundImage.onRendered(function(){ 
    var $img = this.$('img'); //Whatever your selector is, not sure if this.$ works in onRendered though 

    // "one" makes sure event is only fired once, see below 
    $img.one("error", function() { 
    $img.attr('src','/background/image.jpg') 
    }); 

    // If image was loaded, reload it 
    // This is usually used to check if images were loaded from cache 
    // but as you only want to track errors, it's probably unnecessary 
    if($img.get().complete) { 
     $img.load(); 
    } 
})