2013-01-07 64 views
2

我正在使用RequireJS文本插件來加載一些html模板。 當我將字符串文字傳遞給require函數時,它工作正常。RequireJS文本插件和變量級聯字符串

var templateHTML = require('text!templates/template_name.html'); 

但是,當我使用可變連接字符串

var templateName = 'template_name'; 
var templateHTML = require('text!templates/'+templateName+'.html'); 

它拋出以下錯誤:

Uncaught Error: Module name "text!templates/template_name.html" has not been loaded yet for context: _ 

對於這個問題的任何想法?

更新:這是我的測試代碼。

require.config({ 
    paths: { 
     text: '../lib/text', 
    } 
}); 

define(function (require, exports, module) { 
    "use strict"; 
    require(['text'], function (text) { 

     //var templateHTML = require('text!templates/template_name.html'); 

     var templateName = 'template_name'; 
     var templateHTML = require('text!templates/'+templateName+'.html'); 


    }); 
}); 

RequireJS文本版本:2.0.3
RequireJS版本:2.1.1

回答

1

定義的路徑在陣列中,以確保它加載它使用它

var templateName = 'template_name'; 
require(['text!templates/'+templateName+'.html'], templateHTML); 

//now you can use 
this.template = _.template(templateHTML, {}); 
+0

非常感謝你!你拯救了我的一天。 – devopsguy

0

您是否嘗試過這種方式?

require.config({ 
    paths: { 
    text: '../lib/text', 
    } 
}); 

define(function (require, exports, module) { 
    "use strict"; 
    var templateName = 'template_name'; 

    require(['text!templates/' + templateName + '.html'], function (template) { 
     console.log('loaded template: ', template); 
    }); 
}); 

只是一個想法,告訴我是怎麼回事。

0

的依賴性掃描之前,需要裏面只有字符串字面依賴的作品。您應該看看require.js來源,並嘗試找到cjsRequireRegExp變量。 如前所述,您可以使用回調符號加載內容。

cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g 
0

我也有這個問題,同時試圖使用骨幹/木偶。感謝上面的@Ignacio和@Stanislau Tsishkou的洞察力。

我可以用數組+回調的方法來解決這個問題:

var templateName = 'template_name'; 
var templateHTML = require('text!templates/'+templateName+'.html', function (templateHTML) { 
    templateHTML = template; 
); 

// ... 

var View = Backbone.Marionette.ItemView.extend({ 
    // ... 

    template: function() { 
    return Handlebars.compile(templateHTML).apply(null, arguments); 
    }, 

    // ... 
}); 

的重要組成部分是:

  1. 確保您設置,獲取回調返回到所產生的templateHTML可在適當範圍內訪問的變量(templateHTML =模板是實現此目的的原因)。
  2. 如果使用Marionette,請確保您使用的是生成模板的函數,因爲在實際需要之前,它不會嘗試呈現templateHTML。
  3. 如果使用句柄,就像我在這個例子中一樣,一定要使用apply方法,因爲我必須傳遞它在模板函數中使用的任何參數,因爲Handlebars.compile()返回一個函數,而不是編譯模板文本。

如果你沒有使用車把,只下劃線或Lodash,木偶文檔給出一個很好的例子 - http://marionettejs.com/docs/v2.4.2/marionette.itemview.html#itemview-render

template : function(serialized_model) { 
    var name = serialized_model.name; 
    return _.template(templateHTML)({ 
    name : name 
    }); 
}