Knockout.js单击时更改(而不是切换)css类
Knockout.js Change (not toggle) css class on click
我试图在knockout.js点击事件上操作css类,但它不起作用。目前我正在基于$data.IsSelected元素(true|false)的值绑定css类。我无法找到正确的方法来做我想做的事情——例如,我应该用DOM进行操作(就像我现在试图做的那样),还是应该将observableArray元素的值改为true而不是false,然后更新ViewModel,所以理论上这必须更改css类。这是JS。
<script>
function StyleViewModel() {
var self = this;
self.pref = ko.observableArray();
self.img = ko.observableArray(["img/style1.png", "img/style2.png", "img/style3.png", "img/style4.png", "img/style5.png", "img/style6.png"]);
self.toggle = function (data, event) {
if (data.IsSelected == true) {
//Here i'm trying to manipulate with DOM directly
$(event.target).closest("div").removeClass("txt-active").addClass("txt");
$(event.target).find("a.button").text("Добавить");
}
else {
$(event.target).removeClass("txt").addClass("txt-active");
$(event.target).find("div.txt-active > a.button").text("Добавлено");
}
}
$.getJSON('/api/usersprofiles?userguid=' + $("#MainContent_guid").val(), self.pref);
}
$(document).ready(function () {
ko.applyBindings(new StyleViewModel());
$("#go").click(function () {
$("div.test-block").each(function () {
var style = $(this).find("h3").text();
var option = $(this).find("a").text();
var selected;
if (option == "Добавить") {
selected = false;
}
else if (option == "Добавлено") {
selected = true;
}
var json = "{'UserGUID':'" + $("#MainContent_guid").val() + "', 'Style':'" + style + "', 'Selected':'" + selected + "'}"
$.ajax({
type: "POST",
dataType: "json",
contentType: 'application/json; charset=utf-8',
url: "/api/usersprofiles",
data: json,
success: function () { },
error: function (xhr, status, error) {
var err = eval("(" + xhr.responseText + ")");
alert(err.Message);
}
});
});
setTimeout(function () {
window.location.replace("default.aspx");
}, 3000);
});
});
</script>
这是HTML显示绑定:
<input type="hidden" runat="server" id="guid" />
<div class="container">
<div class="title">
<h2>Вкусы</h2>
<p>Что вам по душе?</p>
</div>
<div class="styles" data-bind="foreach: pref">
<div class="test-block" data-bind="click: $root.toggle">
<input type="hidden" data-bind="value: $data.Id" />
<div class="bigshadowtest">
<img alt="" src="img/bigshadow.png">
</div>
<div data-bind="css: $data.IsSelected == true ? 'txt-active' : 'txt'">
<h3 data-bind="text: $data.name"></h3>
<a href="#" class="button" data-bind="text: $data.IsSelected == true ? 'Добавлено' : 'Добавить'"></a>
</div>
<img alt="" data-bind="attr: { src: $root.img }">
</div>
</div>
<table class="info" style="width: 100%; height: 100%;">
<tr>
<td style="text-align: center; vertical-align: middle;">
<a href="#" id="go" class="gobtn">Поехали!</a>
</td>
</tr>
</table>
</div>
附言:还有一个问题——我无法将observableArray self.img绑定到相应的img元素。
使可观察数组的元素可观察。通过映射插件,您的isSelected将是可观察的,并将其值的变化反映到ui中。
更改您的getJson方法(未经测试的代码)
$.getJSON('/api/usersprofiles?userguid=' + $("#MainContent_guid").val(), function(data) {
ko.mapping.fromJS(data, self.pref);
});
或者,u可以创建一个新的pref对象,将服务器中的数据绑定到循环中的数据,并将它们推送到observableArray中,而不是使用映射插件。这种方式比使用映射插件更可控。
var oPref = function (data) {
var self = this;
self.Id = ko.observable(data.Id);
self.IsSelected = ko.observable(data.IsSelected);
self.name = ko.observable(data.name);
self.imgLink = ko.observable(data.imgLink);
self.toggle = function () {
if (self.IsSelected()) self.IsSelected(false);
else self.IsSelected(true);
}
}
function StyleViewModel() {
var dataFromServer = [
{ Id: 1, IsSelected: false, name: "name1", imgLink: "img/style1.png" },
{ Id: 2, IsSelected: false, name: "name2", imgLink: "img/style2.png" },
{ Id: 3, IsSelected: false, name: "name3", imgLink: "img/style3.png" }]
var self = this;
self.pref = ko.observableArray();
ko.utils.arrayForEach(dataFromServer, function(item) { self.pref.push(new oPref(item)); });
}
$(document).ready(function () {
ko.applyBindings(new StyleViewModel());
});
你的html应该如下
<input type="hidden" runat="server" id="guid" />
<div class="container">
<div class="title">
<h2>Вкусы</h2>
<p>Что вам по душе?</p>
</div>
<div class="styles" data-bind="foreach: pref">
<div class="test-block" data-bind="click: toggle">
<input type="hidden" data-bind="value: Id" />
<div class="bigshadowtest">
<img alt="" src="img/bigshadow.png">
</div>
<div data-bind="css: { 'txt-active': IsSelected(), 'txt': IsSelected() == false }">
<h3 data-bind="text: name"></h3>
<a href="#" class="button" data-bind="text: (IsSelected() == true ? 'Добавлено' : 'Добавить')"></a>
</div>
<img alt="" data-bind="attr: { src: imgLink }">
</div>
</div>
<table class="info" style="width: 100%; height: 100%;">
<tr>
<td style="text-align: center; vertical-align: middle;"> <a href="#" id="go" class="gobtn">Поехали!</a>
</td>
</tr>
</table>
</div>
相关文章:
- 单击更改图标并通过javascript添加一个css类
- 如果30秒未单击,请应用CSS一次,将其删除,然后重新迭代
- 单击时如何更改单选按钮的CSS
- 使用javascript单击同一按钮,在两种样式之间更改css值
- 单击css动画后丢失的事件
- 在css/javascript中单击,切换图像上的去饱和度
- casperjs-css选择器存在,但当单击它时会引发“”;CasperError:无法在不存在的选择器“”上调度mou
- 单击启动CSS导航活动类更改
- 阻止在单击和关闭覆盖菜单css时滚动正文
- 在可视化中将CSS从悬停更改为单击
- 单击禁用的按钮添加 CSS
- 单击相应的“btn”时编辑“项目”的css
- 如何在单击时更改序号元素的CSS
- 单击标签后,使用Javascript更改正文CSS
- 在angularJs中单击更改css类
- 单击后使CSS悬停元素永久化
- jQuery/ CSS:单击时突出显示行不起作用
- CSS 单击后关闭下拉菜单
- 使用 CSS 单击图像时显示文本
- jQuery/CSS-单击IFRAME内容内的按钮时更改IFRAME高度