knockout.js将表单加载到viewModel中

时间:2012-06-04 19:05:06

标签: asp.net-mvc-2 data-binding knockout.js

我目前正成功使用knockout.js来处理我的应用程序中的所有数据绑定。但是,在每个页面加载时,在我的document.ready中我正在做一个像这样的初始异步数据加载:

$(document).ready() {
  getData()
});

但是,是否可以将数据加载到表单中(使用ASP.NET MVC2),然后根据数据绑定标记将数据反向加载到视图模型中?

我觉得这不起作用,我只想确认我没有做任何不正当的事情。

2 个答案:

答案 0 :(得分:3)

'value'绑定最初将元素的值设置为视图模型中的值,因此不是。但是,您可以将“value”绑定的代码复制到您自己的处理程序中,该处理程序最初根据控件上的值设置模型值。下载淘汰的debug version,并在第2182行查找ko.bindingHandlers['value'] = {。复制此绑定处理程序声明并将'value'更改为其他内容,然后在init结束时添加对valueUpdateHandler()的调用:

ko.bindingHandlers['myvalue'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
        // skipping code
        valueUpdateHandler(); // update model with control values
    },
    'update': function (element, valueAccessor) {
        // skipping code
    }
};

现在,当您使用myvalue绑定时,您的模型将在最初绑定时使用控件值进行更新:

<input type="text" data-bind="myvalue: name"></input>

或者你可以调用原始值而不是复制所有代码,只需在init之后添加valueUpdateHandler中的代码:

ko.bindingHandlers['myvalue'] = {
    'init': function (element, valueAccessor, allBindingsAccessor) {
        // call existing value init code
        ko.bindingHandlers['value'].init(element, valueAccessor, allBindingsAccessor);

        // valueUpdateHandler() code
        var modelValue = valueAccessor();
        var elementValue = ko.selectExtensions.readValue(element);
        ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'value', elementValue, /* checkIfDifferent: */ true);
    },
    'update': function (element, valueAccessor) {
        // call existing value update code
        ko.bindingHandlers['value'].update(element, valueAccessor);
    }
};

如果您不想使用AJAX,可以通过将模型序列化为JSON(razor语法)来将值放入javascript中:

<script type="text/javascript">
var model = @(new HtmlString(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)));
</script>

答案 1 :(得分:1)

这里有一个有效的例子(不是我的)有几种不同的方法来实现这个目标:

http://jsfiddle.net/rniemeyer/5Z2SC/