Knockout.js视图模型发生了变化,但检查标记在发布的网站上没有变化

时间:2017-03-15 00:07:37

标签: javascript visual-studio visual-studio-2013 knockout.js

我正在使用一个利用Knockout.js进行界面处理的Razor页面。当viewmodel更改值,并且数据库在保存时正确存储它们时,单击时复选标记不会更改。

我研究了类似的问题,发现this answer。不幸的是,在使Knockout click事件返回true时,允许在Visual Studio中运行时检查标记在视觉上发生变化,标记在已发布的开发站点上不会更改。

复选框在Razor中定义为:

<div class="col-md-3">
     <label class="checkbox-inline" for="NeedsFurtherReview">
         <input id="NeedsFurtherReview" type="checkbox" data-bind="checked: $parent.NeedsFurtherReview, visible: !$parent.HasBeenProcessed(), click: $parent.MarkCheckToggled()" /> Further Review Needed
     </label>
 </div>
 <div class="col-md-3">
     <label class="checkbox-inline" for="PendingFinalization" data-bind="visible: !$parent.HasBeenProcessed()">
         <input id="PendingFinalization" type="checkbox" data-bind="checked: $parent.PendingFinalization, enable: $parent.CanBeProcessed(), visible: !$parent.HasBeenProcessed(), click: $parent.MarkCheckToggled()" /> Ready for Final Processing
     </label>
 </div>

复选框在knockout.js视图模型中对应:

Self.PendingFinalization = ko.observable(pendingFinalization);

Self.CheckToggled = ko.observable(false);

Self.MarkCheckToggled = function () {
    Self.CheckToggled(true);
    return true;
};

这有点奇怪的是它在IE中运行良好。事实上,当没有从MarkCheckToggled返回时它在IE中工作正常,并且它在click事件中被称为$ parent.MarkCheckToggled。实际上,IE现在在单击框时会在Visual Studio中抛出异常,但它不会阻止它运行,或者以任何可视方式在发布的网站上抛出此错误。

  

第4190行http://localhost:26021/Scripts/knockout-3.4.0.debug.js

第25列未处理的异常      

0x800a01b6 - JavaScript运行时错误:对象不支持属性   或方法&#39;申请&#39;

提前感谢您的任何建议。我很乐意提供更多细节。这是我关于Stack Overflow的第一个问题,所以如果这个问题没有尽可能好,我会提前道歉。

2 个答案:

答案 0 :(得分:1)

首先,只是澄清:作为客户端技术的淘汰赛并不关心它的部署地点。如果在本地运行和部署时存在差异,则差异必须在于客户端或客户端资产的服务方式。

只要在没有返回的IE中正常工作,这取决于你所指的IE的版本。

就您的错误而言:点击绑定需要一个函数引用,因此您应该将该部分更改为click: $parent.MarkCheckToggled

然而,我认为有一种更容易理解的方法来解决你没有利用的淘汰模型。您可以改为响应模型更改,而不是响应UI事件。在这种情况下,我会subscribe更改NeedsFurtherReviewPendingFinalization可观察对象,并将MarkCheckToggled函数作为响应触发。

答案 1 :(得分:0)

click绑定需要函数引用。所以你可能想要click: $parent.MarkCheckToggled而不是click: $parent.MarkCheckToggled()

否则,链接的答案是正确的,您需要从点击处理程序return true

但也许更好的方法是链接到change事件而不是clickchange: $parent.MarkCheckToggled