尝试"禁用" div
如果其索引与点击的a
代码不匹配:
<div data-bind="foreach: slides" class="slidebtns">
<a class="slidebtn" data-bind="text: title, click: $parent.activeIndex.bind($data, $index())" href="#"></a>
</div>
<div data-bind="foreach: slides">
<div class="screen" data-bind="attr: { id: title }, disable: $parent.activeIndex() !== $index">
<div>test</div>
</div>
</div>
CSS:
... .disabled {
display: none;
}
JS:
function viewModel() {
var self = this;
self.activeIndex = ko.observable(0);
self.numSlides = ko.observable(3);
...
self.slides = ko.computed(function() {
var arr = [], n;
if (self.numSlides()<6) n = self.numSlides();
else n = 5;
for (var i=0; i<n; i++) {
arr.push(slideModel(i));
}
return arr;
});
}
function slideModel(n) {
var self = this;
self.includeImage = ko.observable(true);
self.imageSrc = ko.observable('slide_bg1.jpg');
return { title: 'slide'+(n+1) };
}
ko.applyBindings(new viewModel());
哪个不起作用。每个div
都会收到一个disabled
类。
作为测试,我将最后一个div更改为以下内容以确保activeIndex实际上在点击时正确更新(并且它是):
<div class="screen" data-bind="attr: { id: title }, css: $root.activeIndex() !== $index ? 'disabled' : ''">
<div data-bind="text: $root.activeIndex()"></div>
</div>
但是,我对KO太新了,想知道在单击.slidebtn a
时如何额外输出屏幕$ index,这样我就可以实际检查索引是否相等(无论如何,它们应该相等)因为容器中每种元素类型只有3种。
答案 0 :(得分:0)
只需添加一个禁用绑定,它将为您的元素提供没有任何神奇技巧的类 -
<div data-bind="disable: $parent.activeIndex() !== $index"></div>
您可以添加一个元素,让您知道它们实际上是否也是相同的值,以帮助调试。
<div><span data-bind="text: $parent.activeIndex()"></span> equals<span data-bind="text: $index"></span>?</div>
修改强>
上面的答案是,如果您使用的是禁用的HTML属性,而不是“禁用”类。您可以使用此选择器应用CSS -
div:disabled {
display: none;
}
如果你必须为此使用一个类,那么你将使用你之前提到的CSS绑定处理程序 -
<div data-bind="css: { disabled: $root.activeIndex() !== $index ? }"></div>
然而,所有这些都说,如果你试图隐藏它,如果它不匹配,那么只需使用可见的绑定 -
<div data-bind="visible: $parent.activeIndex() !== $index"></div>
答案 1 :(得分:0)
除了PW Kad提到的其他问题:slideModel()
没有做你认为它做的事情,因为你开始编写它就好像它是一个应该用new
调用的“经典”构造函数,但你不要那样称呼它。因此,它内部self
实际上将成为全局对象(因为在未被称为构造函数或方法的函数中,this
引用全局对象)。因此,每次调用它时,实际上都会设置名为includeImage
和imageSrc
的全局变量。
替换
return { title: 'slide'+(n+1) };
与
self.title = 'slide'+(n+1);
并使用new
调用它(在这种情况下,您应该将其重命名为SlideModel
,因为标准约定是经典构造函数以大写字母开头,提醒您需要使用{{1} }),或替换
new
与
var self = this;
并以
结束var self = {};
并继续以您目前的方式调用它。