我正在使用Hot Towel模板创建SPA项目。 我有列表视图,显示项目列表,当点击项目时,它将转到详细视图。
router.mapRoute('details/:module/:id', 'viewmodels/details', 'Details', false);
详细信息屏幕的URL变为:
https://xxx/test/#/details/news/4
我的详细信息屏幕包含一个可观察的数组,该数组在details.js激活方法上使用AJAX填充。
<button class="btn btn-info"
data-bind="click: save">
<i class="icon-save"></i>Save</button>
<form id="myform" data-bind="submit: submitForm">
<table>
<tbody data-bind="foreach: screenDataArray">
<tr>
<td data-bind="text: FieldLabel"></td>
<td>
<input data-bind="value: FieldValue" />
</td>
</tr>
</tbody>
</table>
</form>
FieldLable和FieldValue显示没有问题,假设这意味着数据绑定确实是正确的。
我更改了FieldValue,当我点击Save按钮时:
var save = function () {
ko.utils.arrayForEach(screenDataArray(), function (sd) { alert(sd.FieldName + ":" + sd.FieldValue); });
我的问题是FieldValue仍包含原始值(未更新)。
现在我点击浏览器刷新按钮。
我更改了值并点击了保存。
现在,保存功能会提醒正确的更改值。
我认为代码链完全相同,但我不明白为什么从列表视图重定向时它不起作用,但刷新会突然发挥作用。
提前感谢您的帮助。
答案 0 :(得分:1)
从您发布的代码段开始:
var save = function () {
ko.utils.arrayForEach(screenDataArray(), function (sd) { alert(sd.FieldName + ":" + sd.FieldValue); });
看起来FieldValue本身不是一个可观察的(它需要你的代码才能工作)。 observableArrays将监听像添加和删除元素(在observableArray本身上调用的方法)之类的更改,但是他们并不真正知道其中一个元素何时发生更改。这可以通过观察来实现元素本身。