我正在构建一个实现“分面”或“过滤”接口的简单应用程序——没有数据写入。我希望用户选择左侧的构面(复选框)以减少右侧的结果集。
我有 2 个单独的集合(方面和激励)。这些是从一个包含由 2 个项目组成的数组的单个 json 对象填充的。每 2 个项目有助于为页面的这两个部分创建模型、视图和集合。
我需要在方面视图中获取事件以更新激励收集的结果。将这两者连接在一起的最佳方法是什么。我的测试应用可以在这里找到。我正在使用 Handlebars 进行模板化。
在这里看到它:演示站点
主要内容区域是由这样的“汽车激励”组成的。
//define Incentive model
var Incentive = Backbone.Model.extend({
defaults: {
photo: "car.png"
}
});
//define individual incentive view
var IncentiveView = Backbone.View.extend({
tagName: "article",
className: "incentive-container",
template: Handlebars.compile($("#incentive-template").html()),
initialize: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
//define Incentives collection
var Incentives = Backbone.Collection.extend({
model: Incentive,
url: 'data/incentives3.json',
parse: function(response) {
return response.incentiveHolder;
}
});
var IncentivesView = Backbone.View.extend({
el: $(".incentives-container"),
initialize: function() {
this.collection = new Incentives();
// When the contents of the collection are set, render the view.
this.collection.on('reset', function() {
incentives = this.collection.models;
this.render();
}, this);
this.collection.fetch();
this.collection.on("reset", this.render, this);
},
render: function() {
this.$el.find("article")
.remove();
_.each(this.collection.models, function(item) {
this.renderIncentive(item);
}, this);
},
renderIncentive: function(item) {
var incentiveView = new IncentiveView({
model: item
});
this.$el.append(incentiveView.render()
.el);
}
});
刻面模型/集合详述如下。你可以在 FacetView 中看到——当用户选择一个复选框时,我已经注册了一个“更改”事件。我需要一些如何使用这些数据来 1) 隐藏不包含此方面值的每个激励或 2) 从 FacetCollection (??) 中删除模型。我希望用户能够快速打开/关闭这些复选框 - 删除/添加速度较慢(或效率较低)然后使用 css 隐藏/显示?
此外,您可以从我的 displayIncentives() 函数中看到“this”——是视图的一个实例——但我如何访问刚刚单击的复选框的“值”?
如果我能得到这个值——那么我可以检查激励集合,遍历每个项目——并询问它的“激励”数组“包含”刚刚单击的复选框的这个值。如果返回 false,我将隐藏(或删除?)该项目并继续。
// ======================================
// FACETS
// ======================================
//define Facet model
var Facet = Backbone.Model.extend({});
//define individual facet view
var FacetView = Backbone.View.extend({
tagName: "div",
className: "facet-group",
template: Handlebars.compile($("#facets-template").html()),
initialize: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
events: {
"change input[type=checkbox]": "displayIncentives"
},
displayIncentives: function() {
console.log(this);
}
});
//define Facets collection
var Facets = Backbone.Collection.extend({
model: Facet,
url: 'data/incentives3.json',
parse: function(response) {
return response.facetsHolder;
}
});
var FacetsView = Backbone.View.extend({
el: $(".facets-container"),
initialize: function() {
this.collection = new Facets();
// When the contents of the collection are set, render the view.
this.collection.on('reset', function() {
this.render();
}, this);
this.collection.fetch();
},
render: function() {
_.each(this.collection.models, function(item) {
this.renderFacet(item);
}, this);
},
renderFacet: function(item) {
var facetView = new FacetView({
model: item
});
this.$el.append(facetView.render().el);
}
});
最后——我的 json 对象位于此处……我现在可以自由地帮助设计该对象在该项目的下一阶段的结构。任何建议都非常感谢。