2012-06-04 41 views
2

我目前成功地使用knockout.js来处理我的应用程序中的所有数据绑定。然而,在每个页面加载,在我的document.ready我做这样的初始asnychronous数据加载:knockout.js加载表单到viewModel

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

但是,是否有可能代替,将数据加载到一个表单(使用ASP.NET MVC2),然后将数据反向加载到基于数据绑定标签的视图模型中?

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

回答

3

'value'绑定最初将元素的值设置为您的视图模型中的值,因此不会。但是,您可能可以将“值”绑定的代码复制到您自己的处理程序中,该处理程序最初会根据控件上的值设置模型值。下载淘汰赛debug version,寻找ko.bindingHandlers['value'] = {上线2182拷贝装订处理程序声明和变化“价值”别的东西,然后在初始化的末尾添加到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> 

另外,您可以调用原始值,而不是复制所有的代码,刚刚从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(剃刀语法)得到的值转换为JavaScript:这里

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

最后一部分是我一直在寻找确切的答案。这很好。当然,将它包含在我的直接aspx文件中,然后从外部JS文件中引用它是有点遗憾的,但是,这正是我所寻找的。谢谢! –