【发布时间】:2014-03-19 13:36:16
【问题描述】:
我正在尝试使用 Knockout 切换嵌套项目的可见性。在页面的初始显示上,我不希望嵌套项目可见。如果用户单击链接以显示嵌套项,那么我希望显示这些嵌套项(不是所有嵌套项)。
例如,我有一个产品列表,对于每个产品,我都有一个星级列表。默认情况下或对于初始页面加载,评级不显示。如果用户单击“评分”,则显示该项目的评分。如果用户单击另一个项目的“评分”,则该产品的评分将与另一个一样显示。
为了说明,我有两个产品:
三星评分
iPhone 评分
如果我点击 iPhone 的评级,则会显示 iPhone 的评级:
Samsung Ratings
iPhone Ratings
1203: 3
1204: 2
如果我点击三星的评级,那么三星的评级也会显示:
Samsung Ratings
1201: 5
1202: 4
iPhone Ratings
1203: 3
1204: 2
然后,如果我单击任一产品的评级,该产品的评级将变得不可见。
我的示例 HTML 如下:
<ul data-bind="foreach: products">
<li><span data-bind="text: ProductName"></span>
<a href="#" data-bind="click: $parent.toggleVisibility">Ratings</a>
<ul data-bind="foreach: StarRatings, visible: $parent.shouldShowRatings">
<li><span data-bind="text: RatingId"></span>: <span data-bind="text: RatingValue"></span></li>
</ul>
</li>
</ul>
使用 Knockout.js 3.0.0 的示例 javascript 如下:
var initialProducts = [{
ProductName: "Samsung",
StarRatings: [{
RatingId: 1201,
RatingValue: 5
},
{
RatingId: 1202,
RatingValue: 4
}
]
}, {
ProductName: "iPhone",
StarRatings: [{
RatingId: 1203,
RatingValue: 3
},
{
RatingId: 1204,
RatingValue: 2
}
]
}];
(function (ko) {
function products(data) {
var self = this;
data = data || {};
// Persisted properties
self.ProductId = data.ProductId;
self.StarRatings = data.StarRatings;
}
})(ko);
var viewModel = (function(ko){
var products = ko.observableArray(initialProducts),
showRatings = ko.observableArray(),
toggleVisibility = function(item) {
if(showRatings.indexOf(item) < 0){
showRatings.push(item);
}
else{
showRatings.remove(item);
}
},
shouldShowRatings = function(item) {
if( showRatings.indexOf(item) >= 0){
return true;
}
{
return false;
}
};
return {
products: products,
showRatings: showRatings,
toggleVisibility: toggleVisibility,
shouldShowRatings: shouldShowRatings
};
})(ko);
ko.applyBindings(viewModel);
我可以显示所有评级或不显示。我还能够将其设置为一次只显示一个,但我认为这段代码最接近我需要的解决方案。
看起来在点击事件之后,shouldShowRatings 对于 StarRatings 可见性没有调用可见性。
示例代码也在 jsFiddle 上 http://jsfiddle.net/justinnafe/866my/4/
【问题讨论】: