Javascript 从.ajax()调用加载knockout.js observatarray()
这让我困惑。一定是什么小东西我没看见。我正试图通过一个ajax调用在knockout中加载一个非常简单的Javascript 从.ajax()调用加载knockout.js observatarray(),javascript,json,ajax,knockout.js,Javascript,Json,Ajax,Knockout.js,这让我困惑。一定是什么小东西我没看见。我正试图通过一个ajax调用在knockout中加载一个非常简单的observableArray javascript // we bind the array to the view model property with an empty array. var data = []; var viewModel = { vendors: ko.observableArray(data) }; ko.applyBindings(viewMode
observableArray
javascript
// we bind the array to the view model property with an empty array.
var data = [];
var viewModel = {
vendors: ko.observableArray(data)
};
ko.applyBindings(viewModel);
$(function () {
// on this click event, we popular the observable array
$('#load').click(function () {
// WORKS. Html is updated appropriately.
viewModel.vendors([{ "Id": "01" },{ "Id": "02" },{ "Id": "03" }]);
// DOES NOT WORK. Fiddler2 shows the same exact json string come back
// as in the example above, and the success function is being called.
$.ajax({
url: '/vendors/10',
dataType: 'json',
success: function (data) {
viewModel.vendors(data);
}
});
});
});
html
<button id="load">Load</button>
<ul data-bind="template: { foreach: vendors }">
<li><span data-bind="text: Id"></span></li>
</ul>
加载
问题:为什么成功的ajax调用(who's
data
变量值逐字节匹配硬类型值)不会触发html刷新?这没有理由不起作用。正如这所证明的
我将检查ajax帖子是否实际返回json数据,json是否是一个数组,是否正确解析
我必须调整ajax调用,以使fiddle ajax处理程序正常工作
我想不出更多的了
希望这有帮助。我认为这是一个bug,当我们将Knockout的示例与包装类一起使用时,它是有效的:
public class ResultWrapper
{
public Title {get;set;}
public List<Result> {get;set;}
}
公共类ResultWrapper
{
公共标题{get;set;}
公共列表{get;set;}
}
但如果我们直接返回结果,就没有办法约束它。(没有额外的应用绑定!)
使用self.vendors而不是这个viewModel.vendors我们可以使用一个简单的JavaScript util函数作为解决方法 而不是
viewModel.vendors(数据)代码>,用eval包装(首先研究eval的危险性)将起作用
eval("viewModel.vendors("+JSON.stringify(data)+");");
下面是我在MVC.net应用程序中使用knockout和jquery所做的操作
//Scripts/groItems.js
(功能(){
var ViewModel=函数(){
items=ko.observearray(),
ItemName=ko.observable(),
Img=ko.可观察(),
数量=可观察到的数量()
}
$.getJSON('/Items2/AllItems',函数(数据){
对于(变量i=0;i
@model IEnumerable
@{
ViewBag.Title=“Index”;
}
@ActionLink(“新建”、“创建”)
项目名称
img
数量
@节脚本{
}
感谢您验证我的理智。。。我再仔细看看。也许MVC会吸一点包装纸什么的……是的。Firebug请求响应,验证您是否获得json,然后验证jquery是否正在将其解析为对象。它确实是json。。。C#代码看起来像返回Json(list,JsonResponseBehavior.AllowGet)
其中list
是一个ICollection`所以我知道它是JSON。除此之外,Fiddler2在其JSON视图中正确显示了数据。。。它在javascript的某个地方。当我在workDo不使用eval时,我明天会再次发布更多信息
eval("viewModel.vendors("+JSON.stringify(data)+");");