2013-12-21 6 views
3

Мне интересно, как работать с данными синхронизации и помощниками руля. Я хочу загрузить сообщения cms в одностраничное приложение, и я опробовал следующий метод и не смог его достичь.помощники handlebar.js с асинхронными данными

См. Следующий код.

function loadCmsMessage(key) { 

    var cms = { 
      "msg.001": "Hello {0} {1}" 
     }; 

     var deferred = $.Deferred(); 
     setTimeout(function() { 
      var msg = cms[key]; 
      deferred.resolve(msg); 
     }, 1000); 

     return deferred.promise(); 
    } 

Handlebars.registerHelper('cms', function (key, arr) { 

    var promise = loadCmsMessage(key); 

    promise.done(function (str) { 
     str = Handlebars.Utils.escapeExpression(str); 

     if ($.isArray(arr)) { 
      $.each(arr, function (i) { 
       var safeStr = Handlebars.Utils.escapeExpression(arr[i]); 
       str = str.replace("{" + i + "}", safeStr); 
      }); 
     } 

     var result = '<span class="cms-data">' + str + '</span>'; 

     return new Handlebars.SafeString(result); 
    }); 

}); 

$(document).ready(function() { 
    var template = Handlebars.compile($("#myTemplate").html()); 
    $("#wrap").html(template({ 
     "person": ['Jane', 'Fonda'] 
    })); 
}); 
+0

Функции шаблона Handlebars генерируют строку, неизменяемую в javascript. Вы должны сделать свой вызов ajax и, возможно, регенерировать шаблон, когда контент входит в него из-за пределов для рулей. Некоторые рамки обеспечивают средства этой функциональности, такие как ember и угловые, я считаю – megawac

+0

Я использую Marionette поверх Backbone. – fernando

ответ

2

Вы не можете. Операция return находится во внутренней функции Promise. Помощники ручек не допускают асинхронности.

Смежные вопросы