#backbone.js #underscore.js #marionette
#backbone.js #underscore.js #марионетка
Вопрос:
Я новичок в backbone, а также в marionette. Idk, почему я получаю эту ошибку. Моя структура кажется правильной, но ошибка сохраняется.
Это мой index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="css/main.css">
</head>
<body>
<!-- Main App -->
<div id="main-area"></div>
<!-- Templates -->
<script id="main-tpl" src="templates/main.tpl" type="text/x-template"></script>
<!-- 3rd party Dependencies -->
<script src="vendor/jquery/dist/jquery.js"></script>
<script src="vendor/underscore/underscore.js"></script>
<script src="vendor/backbone/backbone.js"></script>
<script src="vendor/backbone.wreqr/lib/backbone.wreqr.js"></script>
<script src="vendor/backbone.babysitter/lib/backbone.babysitter.js"></script>
<script src="vendor/marionette/lib/backbone.marionette.js"></script>
<script type="text/javascript">
// External templates load
_.each(document.querySelectorAll('[type="text/x-template"]'), function (el) {
$.get(el.src, function (res) {
el.innerHTML = res;
});
});
var App = new Backbone.Marionette.Application();
_.extend(App, {
Controller: {},
View: {},
Model: {},
Page: {},
Scrapers: {},
Providers: {},
Localization: {}
});
App.addRegions({
Main: '#main-area'
});
App.addInitializer(function (options) {
var mainView = new App.View.Main();
try {
App.Main.show(mainView);
} catch(e) {
console.error('Error on Show Main: ', e, e.stack);
}
});
App.View.Main = Backbone.Marionette.Layout.extend({
template: '#main-tpl'
});
(function(App) {
'use strict';
App.start();
})(window.App);
</script>
</body>
и мой template/main.tpl
— это только тестовый html.
<div>sounds</div>
Все сторонние пути зависимостей верны.
Появляющаяся ошибка заключается в следующем: Error: Could not find template: '#main-tpl'
Может кто-нибудь сказать мне, где я не прав? Спасибо.
РЕДАКТИРОВАТЬ: я думаю, что проблема в том, что $.get
выполняется асинхронно, и шаблон загружается после того, как backbone попытается выполнить рендеринг, как я могу это решить?
Ответ №1:
Вы можете обновить свой HTML и заменить
<script id="main-tpl" src="templates/main.tpl" type="text/x-template"></script>
с
<script id="main-tpl" type="text/html">
--- template code ---
</script>
Или используйте плагин RequireJS !text для загрузки файлов шаблонов в представления марионетки.
Комментарии:
1. Но эта часть кода делает это
_.each(document.querySelectorAll('[type="text/x-template"]'), function (el) { ...
Ответ №2:
Проблема в том, что шаблон загружается после инициализации приложения.
Вместо этого попробуйте это:
$(function () {
var tplList = document.querySelectorAll('[type="text/x-template"]');
var tplCounter = 0;
_.each(tplList, function (el) {
$.ajax({
'url': el.src,
success: function (res) {
el.innerHTML = res;
tplCounter;
if(tplCounter == tplList.length){
App.start();
}
}
});
});
});
Ответ №3:
define(['marionette','tpl!cell.tpl'],function(tpl){
var Mn = Backbone.Marionette;
var MyView = Mn.View.extend({
className: 'bg-success',
template: tpl,
regions: {
myRegion: '.my-region'
}
});
})
var model = new Backbone.Model({});
var myView = new MyView({model:model});