How to load external template synchronously with b

2020-03-31 08:37发布

I'm trying to build a mobile application with phonegap, backbone.js and coffeescript. I want to do something like this :

class MyApplication.Views.EntriesIndex extends Backbone.View
  template: load('my/template') //It will load the external file my/template.tpl

  render: ->
    $(@el).html(@template())
    this

I want to load it synchronously. I already seen require.js but I find it's too complicated for this simple think. I seen than I can use JST for a rails application but I don't find how to use it without sprocket and my application must to work on the client side only.

What is the better way to load templates synchronously?

I think the better is to preload it.

My application will be hosted on the client side.

3条回答
孤傲高冷的网名
2楼-- · 2020-03-31 09:11

If your application runs as a phonegap app, you might as well include your templates in the HTML:

Explanation of <script type = "text/template"> ... </script>

查看更多
趁早两清
3楼-- · 2020-03-31 09:13

i load my templates this way:

         $.ajax({
            url     : 'my/template.tpl',
            async   : false,
            success : function(tpl) {
                //do something with the template
            }
        });

maybe it`s a solution that works also for you ..

查看更多
Rolldiameter
4楼-- · 2020-03-31 09:23

I did this :

class HomeView extends Backbone.View
  template: ->
    template = "views/home.html"
    cache = window.templates[template]
    return cache if cache

    cache = $.ajax(
      url: "views/home.html"
      async: false).responseText

    window.templates[template] = cache
    return cache

  render: ->
    @$el.html(@template())

And, in my application's initalization :

window.templates = {}

So I can load template asynchronously and cache it. Obviously, I will do some refactoring and, may be, place it into a JQuery function.

Thanks for yours helps.

Edit

I change my code to do this :

class Loader
  @files: {}
  @load: (path) ->
    return @files[path] ||= $.ajax(url: path, async: false).responseText

Now I can do this :

class HomeView extends Backbone.View
  template: ->
    Loader.load("views/home.html")

  render: ->
    @$el.html(@template())

This is the javascript's version :

var Loader;

Loader = (function() {

  function Loader() {}

  Loader.files = {};

  Loader.load = function(path) {
    var _base;
    return (_base = this.files)[path] || (_base[path] = $.ajax({
      url: path,
      async: false
    }).responseText);
  };

  return Loader;

})();

I will probably publish the code on github...

查看更多
登录 后发表回答