- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
几周以来,我一直在研究 Backbone,并根据教程制作了一些简单的应用程序。现在我再次从头开始,并尝试使用 Backbone 提供的不错的功能,因为我应该这样做。
虽然我的观点受到了阻碍。当页面加载时,它会很好地呈现并通过迭代集合来创建其嵌套 View 。当我再次调用 render() 来刷新单个条目的整个列表时,所有 View 属性似乎都未定义。
单个条目的模型:
Entry = Backbone.Model.extend({
});
条目列表:(json.html 是数据端的占位符)
EntryCollection = Backbone.Collection.extend({
model: Entry,
url: 'json.html'
});
var entries = new EntryCollection();
单个条目的 View ,它填充了 Underscore 模板并且应该在模型更改时重新呈现自己。
EntryView = Backbone.View.extend({
template: _.template($('#entry-template').html()),
initialize: function(){
this.model.on('change', this.render);
},
render: function(){
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
查看整个条目列表,它为集合中的每个项目呈现一个 EntryView,如果添加了新项目,则应重新呈现自身。该按钮用于测试目的。
EntryListView = Backbone.View.extend({
tagName: 'div',
collection: entries,
events: {
'click button': 'addEntry'
},
initialize: function(){
this.collection.on('add',this.render);
},
render: function(){
this.$el.append('<button>New</button>'); //to test what happens when a new item is added
var els = [];
this.collection.each(function(item){
els.push(new EntryView({model:item}).render().el);
});
this.$el.append(els);
$('#entries').html(this.el);
return this;
},
addEntry: function(){
entries.add(new Entry({
title: "New entry",
text: "This entry was inserted after the view was rendered"
}));
}
});
现在,如果我从服务器获取集合, View 就可以正常呈现:
entries.fetch({
success: function(model,response){
new EntryListView().render();
}
});
只要我单击按钮将项目添加到集合中,EntryListView 上的事件处理程序就会捕获“添加”事件并调用 render()。但是如果我在渲染函数中设置一个断点,我可以看到所有的属性似乎都是“未定义的”。没有el
,没有collection
...
我哪里错了?感谢您的帮助,
罗伯特
最佳答案
照原样,EntryListView.render
未绑定(bind)到特定上下文,这意味着范围 (this
) 由调用者设置:当您单击您的按钮,这已设置为您的收藏。
您有多种选择来解决您的问题:
在应用 on
时将正确的上下文指定为第三个参数
initialize: function(){
this.collection.on('add', this.render, this);
},
使用_.bindAll 将您的render
函数绑定(bind)到您的 View :
initialize: function(){
_.bindAll(this, 'render');
this.collection.on('add', this.render);
},
使用 listenTo
在调用时为您的函数提供正确的上下文
initialize: function(){
this.listenTo(this.collection, 'add', this.render);
},
你通常会做 2 或/和 3,_.bindAll
给你一个有保证的上下文,listenTo
在你破坏你的 View 时有额外的好处
initialize: function(){
_.bindAll(this, 'render');
this.listenTo(this.collection, 'add', this.render);
},
如果可以的话:
有点像
var EntryListView = Backbone.View.extend({
events: {
'click button': 'addEntry'
},
initialize: function(){
_.bindAll(this, 'render');
this.listenTo(this.collection, 'reset', this.render);
this.listenTo(this.collection, 'add', this.render);
},
render: function(){
var els = [];
this.collection.each(function(item){
els.push(new EntryView({model:item}).render().el);
});
this.$el.empty();
this.$el.append(els);
this.$el.append('<button>New</button>');
return this;
},
addEntry: function(){
entries.add(new Entry({
title: "New entry",
text: "This entry was inserted after the view was rendered"
}));
}
});
var view = new EntryListView({
collection: entries,
el: '#entries'
});
view.render();
entries.fetch({reset: true});
关于backbone.js - BackboneJS : View renders fine, 但刷新未定义的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17446408/
我正在使用 Backbonejs 和 Requirejs 创建单页 Web 应用程序。我的应用程序似乎存在内存泄漏。 为了测试,我创建了一个示例代码。它创建一个 View 对象,调用其 render
我从加载对话框的位置有一个详细信息 View 。 此对话框有一个表单,用户可以在其中输入一些值(对应于我的模型属性) 我从详细信息 View 传递模型并在同一模型中设置值(在表单字段的更改操作上) 现
我正在尝试添加 Jquery Jplayer http://jplayer.org到我的 Backbone 应用程序,但无法运行它。我将脚本设置到 RequireJS 配置文件中,控制台告诉我脚本已加
Click here for the js fiddle example 此模板应该在集合中呈现新消息,我正在尝试遵循 this tuorial使用我自己的版本来呈现消息
由于某种原因,我在保存模型时无法输入 success 和 error block 。无论我的响应是成功“201”还是错误“404”,我的代码都不会命中 debugger 行。有谁知道可能出了什么问题吗
我有一个BackboneJS应用程序,可在 View 上显示Youtube视频。因此,当用户单击缩略图时,Youtube-iframe将打开并播放视频。当用户关闭它并想再次播放时,什么也没有发生。为了
我刚刚开始学习 BackboneJS,我正在编写一个小示例文档来测试它的工作方式。但我很难理解它,目前它根本没有任何意义:) 所以,我有下一个文件结构: /* application.js */ va
在我的 Backbone.js 应用程序中,我有一个路由结构,其中包含一些我只想在一个处理程序中处理的公共(public)部分。例如,这些 URL /#scenario/1/show-report /
我刚刚开始学习backbonejs。这是我的一些演示代码行: var i = 0; Player = Backbone.Model.extend({
我有一个 Backbone 应用程序,使用 HandlebarsJS 作为我的 HTML 模板。现在我有一个按钮可以触发登录弹出框。我的问题是,我必须双击按钮/链接,直到弹出窗口打开。这是为什么??我
我是 Backbonejs 的新手,试图理解这里的模型。我定义了一个这样的模型 var Employee=Backbone.Model.extend({ initialize: functi
在 BackboneJS 的 router.js 中使用 this.initialize(); 和 有什么区别 require(['router'],function(Router) { ro
我正在使用 Rails 3.1 mongodb 和 backbonejs 构建小型单页应用程序。 我有两个可通过 json api 获得的资源。我在 backbone 中创建了两个模型和集合,看起来像
我可以在哪里进行一些计算,例如计算员工工资?是否需要使用外部文件,或者我可以使用模型、集合或 View ? 最佳答案 模型的属性表示数据实体(员工)的状态。它的方法应该改变数据实体的状态。所以模型的方
我在表单和表单数据中有一个上传图像。表单数据存储在模型中 如何将表单数据与文件数据结合并保存模型 我正在设置模型属性以及如何在属性中包含文件数据。我找到了这个链接 Forcing Backbone t
我将 Tastypie 用于我的 RESTful api,将 Backbonejs 用于前端。模型的 fetch 工作正常,但是,对于 Backbone.Collection 我似乎得到了错误的回应:
我有一个代表产品的模型(在 UL 中显示为 LI 项目)和一个包含这些产品的集合。 当我单击一个 LI 时,我希望基础模型的属性设置为 true,而集合中的所有其他模型的属性设置为 false。 //
我想在我的页面顶部创建一个固定位置的导航菜单,它应该在我点击相关链接后显示不同的 View 。我有一个 index.php 文件、一个 mainpage.js 文件和用于集合、模型、 View 、路由
您好,我是 Backbone 的新手,我只是稍微尝试了一下,这是我的代码: var Users = Backbone.Collection.extend ({ url : 'h
我的应用程序的索引页面位于http://cms/admin(我在本地主机上)。索引页上只有一个 a 元素: deneme 当我点击链接时,它会转到/cms/admin/test 我想使用 Backbo
我是一名优秀的程序员,十分优秀!