【发布时间】:2014-08-10 12:29:03
【问题描述】:
在我的 observables 更改后,我在丢失 UI 状态更改时遇到了问题,我希望得到一些建议。
首先,我正在轮询我的服务器以获取更新。这些消息在我的视图模型中,并且
- 完美呈现:
当我的用户点击“回复”或“分配给”按钮时,我会显示一个小表单来执行这些操作:
此时我的问题是,当我的下一个轮询调用返回时,列表重新绑定并且我失去了应该打开表单的状态。我为“currentQuestionID”添加了视图模型属性,这样我就可以使用可见的:绑定并在绑定后重新显示表单。
一旦完成,重新绑定后表单会正确显示在“当前项目”上,但表单值会丢失。也就是说,它重新绑定、重建表单元素、显示它们,但任何用户输入都消失了(这当然是有道理的,因为 HTML 刚刚重新生成)。
我尝试遵循相同的模式(使用 value: binding 来设置 value 和 event: {change: responseChanged} binding 来更新带有值的可观察对象)。 HTML 片段如下所示:
<form action="#" class="tb-reply-form" data-bind="visible: $root.showMenu($data, 'reply')">
<textarea id="tb-response" data-bind="value: $root.currentResponse, event: {keyup: $root.responseChanged}"></textarea>
<input type="button" id="tb-submitResponse" data-bind="click: $root.submitResponse, clickBubble: false" value="Send" />
</form>
<form action="#" class="tb-assign-form" data-bind="visible: $root.showMenu($data, 'assign')">
<select id="tb-assign" class="tb-assign" data-bind="value: $root.currentAssignee, options: $root.mediators, optionsText: 'full_name', optionsValue: 'access_token', optionsCaption: 'Select one...', event: {change: $root.assigneeChanged}">
</select>
<input type="button" id="tb-submitAssignment" data-bind="click: $root.submitAssignment, clickBubble: false" value="Assign"/>
</form>
现在,我最终得到了一个看起来像无限循环的东西,其中设置值会导致发生变化,进而导致值......等等。
我认为“搞砸”只是将其移出 foreach...通过将表单移到 foreach 中的每个
replyForm.appendTo(theContainer).show();
它一直有效,直到第一次投票返回并重新绑定。由于 HTML 是为
- 重新生成的,所以 DOM 不再有我的表单,我尝试抓取它并执行 .appendTo(container) 什么也没做。我想在这里,我也许可以将元素复制到活动项目中而不是移动它?
所以,这一切似乎我错过了一些基本的东西,因为有人必须在淘汰赛中将表单放入 foreach 循环中!
有没有人有策略在淘汰赛中保持绑定项目内的表单状态?
或者,可能,有没有办法让淘汰赛不绑定任何已经绑定的东西,只生成“新”元素。
最后,我是否应该为此取消淘汰赛,并在每次轮询调用返回时自己手动生成“新项目”。
最后一点信息;如果我将轮询间隔设置为 30 秒左右,那么它提交、保存、重新绑定等所有位都会“工作”。我只需要表单及其内容即可通过重新绑定。
非常感谢您的帮助!
【问题讨论】:
-
请发布您的视图模型代码
-
你能在jsfiddle.net上调一下吗
标签: forms data-binding knockout.js