Javascript 从.ajax()调用加载knockout.js observatarray()

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

这让我困惑。一定是什么小东西我没看见。我正试图通过一个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(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)+");");