我有一个脚本,通过将空视图模型应用到我的表单来初始化淘汰赛。
当用户在表单中输入数据时,视图模型会相应更新 - 这是预期的行为。
JavaScript
var viewModel = {
myField : ko.observable(),
init : function (somedata) {
...
ko.applyBindings(this, container);
},
...more stuff...
}
Partial
<%:Html.TextBoxFor(x => x.MyField, new Dictionary<string, object> { { "data-bind", "value: myField, valueUpdate: 'keyup'" } })%>
当我调用我的 javascript 以现有形式应用淘汰赛时,该值已经在MyField
(然后在我的输入字段中)被我的淘汰视图模型中的空数据擦除(该视图模型是驻留在另一个文件中的 javascript 的一部分)。
当页面加载时,MVC 确保MyField
输入元素填充了先前输入的数据MyField
. When init
被调用时,该字段将被视图模型中的值覆盖myField
它是空的,因为它是一个静态 JavaScript 文件。
我该如何解决这个问题?
我尝试了两种方法来处理这样的事情:
1-如果您可以很好地控制服务器端(看起来就像您所做的那样),那么您可以考虑在视图中输出 javascript,将可观察值设置为正确的值。
会有点类似于这样:http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/ http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/。至少这一部分:
<script type="text/javascript">
var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>;
</script>
您可以这样做,并在调用 applyBindings 之前集成initialData,或者可能只是发出直接将您的可观察值设置为正确值的javascript。
2-如果您对服务器端没有很好的控制(第三方控件或只是您此时无法/不愿意更改的东西),那么您可以考虑在页面加载后初始化您的viewModel,但是在调用 applyBindings 之前。您将找到您感兴趣的元素,从中读取元数据或值,并在让绑定完成其工作之前设置您的可观察量。
也许对你来说一个复杂的问题是,听起来目前你所有的 javascript 都在一个单独的文件中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)