gpt4 book ai didi

javascript - 使用下划线模板在backbone.js中渲染

转载 作者:行者123 更新时间:2023-12-02 14:03:53 25 4
gpt4 key购买 nike

我尝试使用下划线的模板呈现项目列表。但它什么也没显示。

我尝试创建 2 个 View ,一个是任务,一个是任务列表,但我坚持使用模板。

  • .render() 的作用是什么?
  • 如果我使用模板,还需要渲染吗?

我认为当您执行 this.$el.html(template_var) 时,数据会映射模板变量?

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="http://backbonejs.org/backbone-min.js"></script>

<script type="text/template" id="task_list">
<li><%=title%></li>
<li><%=priority%></li>
</script>

</script>

<script type="text/javascript">
(function(){

window.App = {
Models:{},
Collections:{},
Views:{}
};

window.template = function(id){
return _.template( $('#' + id).html() );
}


App.Models.Task = Backbone.Model.extend({
title: 'default',
priority: 1
});

App.Collections.Task = Backbone.Collection.extend({
model: App.Models.Task
});

App.Views.Task = Backbone.View.extend({
template: template('task_list'),
render(){
var template = this.template( this.model.toJSON() );
console.log(template)
this.$el.html(template);
return this;
}
})

App.Views.Tasks = Backbone.View.extend({
tagName: 'ul',
render: function(){
this.collection.each( this.addOne, this);
return this;
},
addOne: function(task){
var taskView = new App.Views.Task({ model: task})
taskView.render();
this.$el.append(taskView.render().el);
}
})

var tasks = new App.Collections.Task([
{
title: 'Go to store',
priority: 4
},
{
title: 'Eat',
priority: 3
},
{
title: 'Sleep',
priority: 4
}
])

var tasksView = new App.Views.Tasks({collection: tasks})
$('body').html(tasksView.el)

})()

</script>

</body>
</html>

最佳答案

你们真的很接近,但有一些小问题。

Backbone 可以做很多事情,但它不能为您做的一件事是渲染逻辑,这完全由开发人员决定。所以,你需要:

  • 将 HTML 与 JS 逻辑分开的模板。
  • 一个 render 函数,它使用您最喜欢的技术(在我们的例子中是 jQuery)进行渲染。
<小时/>

主干 View 始终有 root DOM element (el)即使尚未渲染,如果未指定 tagName,则默认为 div

所以你的任务 View 在渲染时看起来像这样:

<div>
<li>Go to store</li>
<li>4</li>
</div>

我稍微更改了模板即可工作。

<小时/>

我将 CSS 移回 HEAD 部分。这是一个标准,但并不是真正的问题之一。

<小时/>

模型中的默认属性应在 defaults property 中指定.

<小时/>

使用 shorthand syntax 定义函数如下所示仅在 ES6 (ECMAScript 2015) 中可用。

render(){

Starting with ECMAScript 2015 (ES6), a shorter syntax for method definitions on objects initializers is introduced. It is a shorthand for a function assigned to the method's name.

并做到compatible with most browser ,你应该使用:

render: function() {
<小时/>

您还忘记在 ListView 上调用渲染。

$('body').html(tasksView.el)

应该是:

$('body').html(tasksView.render().el);
<小时/>

因为您的代码位于 IIFE 内,您不需要使用 window 使您的应用和函数全局化,本地 var 就足够了,并且是更好的编码实践。

<小时/>

<!DOCTYPE HTML>
<html>

<head>
<meta charset="UTF-8">
<title>Title</title>

<!-- CSS should be in the head -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>

<body>



<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js"></script>
<script src="http://underscorejs.org/underscore.js"></script>
<script src="http://backbonejs.org/backbone.js"></script>

<script type="text/template" id="task_list">
<%=title%> (<%=priority%>)
</script>

<script type="text/javascript">
(function() {

var App = {
Models: {},
Collections: {},
Views: {}
};

function template(id) {
return _.template($('#' + id).html());
}


App.Models.Task = Backbone.Model.extend({
defaults: {
title: 'default',
priority: 1
}
});

App.Collections.Task = Backbone.Collection.extend({
model: App.Models.Task
});

App.Views.Task = Backbone.View.extend({
template: template('task_list'),
tagName: 'li',
render: function() {
var template = this.template(this.model.toJSON());
console.log(template)
this.$el.html(template);
return this;
}
});

App.Views.Tasks = Backbone.View.extend({
tagName: 'ul',
render: function() {
this.collection.each(this.addOne, this);
return this;
},
addOne: function(task) {
var taskView = new App.Views.Task({
model: task
})
this.$el.append(taskView.render().el);
}
});

var tasks = new App.Collections.Task([{
title: 'Go to store',
priority: 4
}, {
title: 'Eat',
priority: 3
}, {
title: 'Sleep',
priority: 4
}]);

var tasksView = new App.Views.Tasks({
collection: tasks
});
$('body').html(tasksView.render().el);

})()
</script>

</body>

</html>

关于javascript - 使用下划线模板在backbone.js中渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40199034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com