我正在使用Ko的特殊扩展版本,它在依赖的observable上使用commit()/ peek()类型函数,这样我只将数据保存到表单上(如果它已提交到数据库)(在Ok上)并且还原为取消.
我遇到的问题是当我选中一个复选框时,会在受保护的observable上正确调用write函数.但是,如果取消选中该复选框,则不会调用write函数,因此当模型发送到我的MVC控制器时,复选框boolean仍为TRUE.
为什么淘汰赛没有写出FALSE值?
更新的问题代码:
请在此处查看此JsFiddle以演示:http://jsfiddle.net/b2Qu2/3/
小问题
请注意,演示还有另外一个问题 - 出于某种原因,当我选中/取消选中该复选框时,即使将其链接到dependentObservable,也不会在UI上更新隐藏的值.您仍然可以通过单击"查看"按钮来查看值.
重大问题
重现问题:
1) Click 'peek' button: Shows FALSE - CORRECT
2) Check IsAdmin checkbox
3) Click 'peek' again: Shows TRUE - CORRECT
4) Uncheck IsAdmin
5) Click 'peek' again: SHOWS TRUE - INCORRECT!!
Run Code Online (Sandbox Code Playgroud)
示例场景
想象一下,会显示一个对话框,其中包含Admin用户的复选框.只有1个管理员用户可以设置,如果管理员用户已经存在,则服务器响应有效/无效.然后用户取消选中该复选框,但现在viewmodel认为该复选框始终为真?使用protectedObservable的原因是,如果服务器响应成功,则调用commit()方法,以便在UI上保留所有内容.如果用户取消对话框或发生错误,则不会覆盖原始值.
写入仅在一个值上触发的原因是,只有当它认为需要写入与其绑定的值不同的值时才会触发。因此, protectedObservable 的实际值并没有改变。如果它是 true 并且您尝试将其设置为 true,则写入不会触发,因为它认为它具有正确的值。
我可能会稍微改变一下并使用这样的东西:
ko.protectedObservable = function (initialValue) {
//private variables
var _actual = ko.observable(initialValue),
_temp = ko.observable(initialValue);
//access to temp value
_actual.temp = _temp;
//commit the temporary value to our observable, if it is different
_actual.commit = function () {
if (_temp() !== _actual()) {
_actual(_temp());
}
};
//notify subscribers to update their value with the original
_actual.reset = function () {
_actual.valueHasMutated();
_temp(_actual());
};
return _actual;
};
Run Code Online (Sandbox Code Playgroud)
使用此版本,您可以绑定field1或field1.temp。您甚至不需要查看,因为临时值和实际值都是可观察的。
它看起来像这样: http: //jsfiddle.net/rniemeyer/BwDYE/
| 归档时间: |
|
| 查看次数: |
1934 次 |
| 最近记录: |