ember.js如何为视图显示不同的筛选列表?复杂的设置
ember.js how to display different filtered lists for a view? complex setup
我有一个应用程序,我在其中有一个汽车视图,我有一份国家/地区列表,每个国家/地区都有一个复选框,当我选中一个国家/地区时,它会在下面显示一个视图,其中有该国家可用的零件列表。
检查更多的国家/地区会在页面下方显示更多国家/地区的零件。
零件都存储在一个地方,但需要通过coutry字段进行过滤,才能在该区域显示该国家的零件。
我可以创建国家/地区列表,当选中时,它会在下面显示一个国家/地区部分,其中包含零件列表,但我如何过滤以仅显示该国家/地区。我需要为每个国家创建视图,并为每个国家的零件创建一个控制器来显示吗??
当然还有更好的方法。
编辑:
这就是我需要页面显示的方式:
Coutries : UK <- selected
USA
China <- selected
Parts available in UK:
....
Parts available in China
....
所以我需要显示每个国家的单独列表。
请帮忙Rick
这可能最好使用嵌套视图来解决。你可以在这里看到我的jsFiddle。
我不认为这是一个非常复杂的方法,但如果你对设计有任何问题,请告诉我。
把手:
<script type="text/x-handlebars">
{{#each App.countriesController}}
{{view Ember.Checkbox titleBinding="name" valueBinding="isChecked"}}
{{/each}}
<hr />
{{#each App.countriesController}}
{{#if isChecked}}
{{view App.PartsByCountryView contentBinding="this" partsListBinding="App.partsController"}} <br />
{{/if}}
{{/each}}
</script>
<script type="text/x-handlebars" data-template-name="selected-country">
Country: {{content.name}} <br />
Parts:
{{#each filteredParts}}
{{name}}
{{/each}}
</script>
应用程序代码:
window.App = App = Ember.Application.create();
/**************************
* Models
**************************/
App.Country = Ember.Object.extend({
id: null,
name: "",
isChecked: null
});
App.Part = Ember.Object.extend({
id: null,
name: "",
countryId: null
});
/**************************
* Views
**************************/
App.PartsByCountryView = Ember.View.extend({
content: null,
partsList: null,
templateName: 'selected-country',
filteredParts: function() {
return this.get("partsList").filterProperty('countryId', this.getPath('content.id'))
}.property('partsList.@each').cacheable()
});
/**************************
* Controllers
**************************/
App.set('countriesController', Ember.ArrayController.create({
content: Ember.A()
}));
App.set('partsController', Ember.ArrayController.create({
content: Ember.A()
}));
/**************************
* App Logic
**************************/
$(function() {
App.get('countriesController').pushObjects([
App.Country.create({id: 1, name: "USA"}),
App.Country.create({id: 2, name: "UK"}),
App.Country.create({id: 3, name: "FR"})
]);
App.get('partsController').pushObjects([
App.Part.create({id: 1, name: "part1", countryId: 1}),
App.Part.create({id: 2, name: "part2", countryId: 1}),
App.Part.create({id: 3, name: "part3", countryId: 1}),
App.Part.create({id: 4, name: "part4", countryId: 2}),
App.Part.create({id: 5, name: "part5", countryId: 2}),
App.Part.create({id: 6, name: "part6", countryId: 2}),
App.Part.create({id: 7, name: "part7", countryId: 2}),
App.Part.create({id: 8, name: "part8", countryId: 3}),
App.Part.create({id: 9, name: "part9", countryId: 3}),
App.Part.create({id: 10, name: "part10", countryId: 3}),
App.Part.create({id: 11, name: "part11", countryId: 3})
]);
});
我会这样构建您的应用程序:
- 仅包含零件对象列表的模型。每个对象都包含每个国家存在的该部分的数量
- 一个控制器,用于根据所选国家/地区筛选该列表
- 在控制器中设置所选国家/地区的视图
- 显示控制器中包含选定零件的列表的视图
我在这里做到了:
http://jsfiddle.net/NPeeQ/2/
window.App = Ember.Application.create();
App.model = Ember.Object.create({
parts: Ember.ArrayProxy.create({
content: [
{
name: 'wheel',
stock: {
uk: 3,
fi: 2,
se: 0
}
},
{
name: 'windscreen',
stock: {
uk: 0,
fi: 1,
se: 3
}
}
]}),
countries: ['uk', 'fi', 'se']
});
App.partController = Ember.Object.create({
filterBy: {},
setFilterBy: function (country, on) {
var filterBy = $.extend({}, this.get('filterBy'));
if (on) {
filterBy[country] = true;
} else {
delete filterBy[country];
}
this.set('filterBy', filterBy);
},
// returns all available parts filtered by filterBy.
availableParts: function () {
var parts = App.model.parts;
var filter = this.filterBy;
var arr = [];
App.model.countries.forEach(function(c) {
if (!filter[c]) return;
arr.push({heading:c});
var tmp = App.model.parts.filter(function(p) {
return p.stock[c] && p.stock[c] > 0;
});
arr = arr.concat(tmp);
});
return arr;
}.property('filterBy', 'App.model.parts').cacheable()
});
App.SelectorView = Ember.View.extend({
templateName: 'selector',
click: function(event) {
if (event.target.tagName !== 'INPUT')
return;
var clicked = $(event.target).closest('label');
var index = this.$().find('label').index(clicked);
var country = App.model.countries[index];
var on = event.target.checked;
App.partController.setFilterBy(country, on);
}
});
App.PartsView = Ember.View.extend({
templateName: 'parts'
});
$(function() {
App.selectorView = App.SelectorView.create();
App.partsView = App.PartsView.create();
App.selectorView.append();
App.partsView.append();
})
车把:
<script type="text/x-handlebars" data-template-name="selector">
{{#each App.model.countries}}
<label><input type="checkbox"/> {{this}}</label>
{{/each}}
</script>
<script type="text/x-handlebars" data-template-name="parts">
{{#each App.partController.availableParts}}
{{#if heading}}
<h2>{{heading}}</h2>
{{else}}
{{name}} <br/>
{{/if}}
{{/each}}
</script>
对于明细表,可以使用绑定到控制器上集合的#each
帮助程序。控制器可以观察到绑定到当前所选国家的控制器。当选择发生更改时,它将更新集合,从而自动更新明细栏。
相关文章:
- 使用下拉列表筛选列表(ul>li)
- React中的筛选列表
- 在本地存储中选中复选框,但在加载时也要筛选列表
- 控制器中的筛选列表没有'不起作用
- 我们可以将控制器中的JSON数据(MM/DD/YYYY格式)与今天的's日期,并在数组中显示筛选列表
- 使用 角度$filter服务就地筛选列表
- 在子对象中显示筛选列表的挖空 js.访问要过滤的父对象列表
- 在变量中存储后筛选列表项
- 使用单选按钮筛选列表
- 基于从下拉列表中选择的值的筛选列表不起作用
- SAPUI5:如何在两个视图之间筛选列表
- Jquery按子项筛选列表
- ember.js如何为视图显示不同的筛选列表?复杂的设置
- 如何筛选列表中的项目而不破坏其他筛选器
- 筛选包含多个单词的筛选列表
- JQuery:筛选列表元素
- 使用自动完成功能中的选择来筛选列表
- 如何根据文本框值筛选列表框的内容
- 如何使用jQuery按多个条件正确筛选列表
- 基于用户筛选列表项目's在javascript中的搜索词