Asp.net mvc 4 检测html表淘汰/ASP.NET MVC中的选定行

Asp.net mvc 4 检测html表淘汰/ASP.NET MVC中的选定行,asp.net-mvc-4,knockout.js,Asp.net Mvc 4,Knockout.js,我已经使用ko.mapping.fromJS(Model)将ASP.NETMVC视图模型加载到KnockoutJS中 我的viewModel如下所示: public IEnumerable<FunkyThing>funkyThings; public FunkyThing selectedFunkyThing; 从而刷新页面。MVC视图模型将被重新加载,selectedFunkyThing将被选定的FunkyThing填充,然后从MVC视图模型中重新读取淘汰视图模型。到目前为止还不

我已经使用ko.mapping.fromJS(Model)将ASP.NETMVC视图模型加载到KnockoutJS中

我的viewModel如下所示:

public IEnumerable<FunkyThing>funkyThings;
public FunkyThing selectedFunkyThing;
从而刷新页面。MVC视图模型将被重新加载,selectedFunkyThing将被选定的FunkyThing填充,然后从MVC视图模型中重新读取淘汰视图模型。到目前为止还不错

然后我想更新表以突出显示所选条目。 因此,我更新了tr行,如下所示:

<tr data-bind="css:{'selected': $root.isSelected()}">
但是。。。它不起作用了。 Chrome抛出一个javascript异常,声明FunkyThing参数未定义。
从技术上讲,我想我可以通过改变MVC视图模型来解决这个问题,在阵列中的每个有趣的东西上实际设置一个ISSELECT。然而,我认为必须远离敲除吗?

这些属性不是都是可观察的,所以需要将它们作为函数引用吗?你还需要使你的函数成为一个可计算的可观察函数,我认为:

model.isSelected = ko.computed(function (funkyThing) {
    return funkyThing().funkyThingID() == model.selectedFunkyThing().funkyThingID();
});

你很接近!我添加了
ko.utils.unwrapobbservable
调用,因为我打赌funkyThingID是一个可观察的属性,而不仅仅是一个直接的属性-这是您在
selectFunkyThing
函数中自己做的。你也可以执行它们。不过,我喜欢“展开”的冗长

model.isSelected = function (funkyThing) {
  var thisId = ko.utils.unwrapObservable(model.selectedFunkyThing.funkyThingID);
  return ko.utils.unwrapObservable(funkyThing.funkyThingID) == thisId;
};
然后在文档中,当ko解析绑定时,实际上必须执行这个函数

<tr data-bind="css:{'selected': $root.isSelected($data)}">


如果您想在不重新加载页面的情况下动态更改所选的时髦玩意儿,则此功能会崩溃,但您似乎不需要这样做。太棒了,我花了数小时试图解决这个问题。我认为$data位是我在这里缺少的关键位。非常感谢。
model.isSelected = ko.computed(function (funkyThing) {
    return funkyThing().funkyThingID() == model.selectedFunkyThing().funkyThingID();
});
model.isSelected = function (funkyThing) {
  var thisId = ko.utils.unwrapObservable(model.selectedFunkyThing.funkyThingID);
  return ko.utils.unwrapObservable(funkyThing.funkyThingID) == thisId;
};
<tr data-bind="css:{'selected': $root.isSelected($data)}">