7

我正在尝试编写一个函数,该函数将为我提供一个已编译的车把模板(我的所有模板都在单独的文件中),使用 ajax 调用来获取模板并编译它以供使用,但我需要使用一个承诺,所以我可以实际使用它。

function getTemplate(name){
    $.get('/'+name+'.hbs').success(function(src){
       var template = Handlebars.compile(src);
       //can't return the template here.
    });
}

我如何通过承诺来做到这一点,以便我可以做类似的事情:

$("a").click(function(e){
    getTemplate('form').done(function(template){
       $("body").append(template({
               name: "My Name"
           })
       );
    });
});
4

3 回答 3

16

Chovy,我看到你已经接受了一个答案,但你可能有兴趣知道getTemplate,通过链接.then()而不是.success(),几乎可以像问题中那样写:

function getTemplate(name) {
    return $.get('/'+name+'.hbs').then(function(src) {
       return Handlebars.compile(src);
    });
}

或者,采用 charlietfl 的思想传入数据并返回一个完全组合片段的 Promise :

function getTemplate(name, data) {
    return $.get('/'+name+'.hbs').then(function(src) {
       return Handlebars.compile(src)(data);
    });
}

nett 效果与 charlietfl 的版本相同,getTemplate.then()无需显式创建 Deferred。因此代码更加紧凑。

于 2013-04-21T14:20:31.153 回答
4

以下向getTemplate函数添加数据参数以及模板名称。

$(function(){
  var postData={title: "My New Post", content: "This is my first post!"};
 getTemplate('template-1',postData).done(function(data){
   $('body').append(data)
 })
});

function getTemplate( name,data){
  var d=$.Deferred();

  $.get(name+'.html',function(response){

    var template = Handlebars.compile(response);
    d.resolve(template(data))
  });

  return d.promise();

}

DEMO

于 2013-04-20T10:53:09.383 回答
1

我创建了一个库来帮助解决此类问题,请查看github

您只需将其添加到您的主应用程序视图中:

<script type="text/x-handlebars" data-template-name="application">
    <!-- Your HTML code -->
    <div class="container">
        <div class="modal fade" id="editView" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
            <div class="modal-dialog">
                <div class="modal-content">
                    {{view MainApp.ModalContainerView elementId="modalContainerView"}}
                </div><!-- /.modal-content -->
            </div><!-- /.modal-dialog -->
        </div><!-- modal edit dialog -->
        {{view MainApp.AppContainerView elementId="appContainerView"}}
        {{outlet}}
    </div> <!-- main container -->
</script>

把它放到你的 MainApp

var MainApp = Em.Application.create({
    LOG_TRANSITIONS: true,
    ready: function () {
    /** your code **/
    MainApp.AppContainerView = Em.ContainerView.extend({});
    MainApp.ModalContainerView = Em.ContainerView.extend({});
    /** And other containerView if you need for sections in tabs **/
    });

例如,他们要使用您想要的模板打开一个模式,您只需:

FactoryController.loadModalTemplate(templateName, callback);

并且不要忘记添加 FactoryController 和 RepositoryController

于 2014-08-10T14:13:54.833 回答