1

问题描述

我想问一下如何在 knockout.js 中使用列表 Exbando 对象,我正在使用 Rob Conrey 的 Massive,并且所有返回的结果都是动态的,这对我来说很好,它适合我的需要,但是在将结果发送到淘汰赛时,我只是不'不知道该怎么办。

目标

访问对象属性,如 obj.Name、obj.Brand 等...

示例代码

看法:

<div data-bind="foreach: Products">
    <p>Product name: <strong data-bind="text: Name"></strong></p>
</div>

控制器:

public JsonResult GetProducts() 
{
     Products products = new Products();
     var Model = products.GetAllProducts();
     return Json(Model, JsonRequestBehavior.AllowGet);
}

调用 GetProducts 的结果是:

[[{"Key":"Id","Value":1},{"Key":"Name","Value":"Badass Boots"},{"Key":"Brand","Value": "Nike"},{"Key":"Description","Value":"能让你飞起来的超酷靴子(不是真的!)。"}, etc...]]

脚本文件:

function ProductListViewModel() {
    // Data
    var self = this;
    self.Products = ko.observableArray([]);

    $.getJSON("/Home/GetProducts", function (data) {
        self.Products(data);
    });
}

运行应用程序时出现 JavaScript 错误:

未捕获的 ReferenceError:无法解析绑定。绑定值:文本:名称消息:名称未定义

屏幕截图 1:

在此处输入图像描述

屏幕截图 2:

在此处输入图像描述

4

3 回答 3

2

ExpandoObject一般而言,字典是出于所有意图和目的。当在此处序列化为 JSON 时,它被视为字典并成为键/值对的集合(并非所有序列化程序都以这种方式运行,但您正在使用的序列化程序会这样做)。它不是您可以通过名称访问成员的对象,您必须将其转换为您可以的表示形式(或首先将其序列化为一个表示形式)。

进行转换并不是世界上最糟糕的事情:

function Product(item) {
    var self = this;
    // assuming item is an array of key/value pairs
    ko.utils.arrayForEach(item, function(pair) {
        // doesn't necessarily have to be mapped as an observable
        self[pair.Key] = ko.observable(pair.Value);
    });
}

有了这个,您可以将结果映射到您的产品数组:

$.getJSON("/Home/GetProducts", function (data) {
    self.Products(ko.utils.arrayMap(data, function(item) {
        return new Product(item);
    }));
});
于 2013-09-29T17:00:00.710 回答
1

看起来问题是因为您试图将 ko.observableArray 的值设置为 json 数组。不确定这是否可行。通常我会这样做:

function ProductListViewModel() {
   // Data
   var self = this;
   self.Products = ko.observableArray([]);

   $.getJSON("/Home/GetProducts", function (data) {
       ko.utils.arrayForEach(data, function(item) {
           self.Products.push({
               Name : item.Name
           });
       });
   });

}

使用 knockout 的 arrayForEach 函数遍历您的 json 数组,并将每个对象推入您的 observableArray。

于 2013-09-29T13:56:20.217 回答
0

在您的 JSON 中,我看到了 and 的序列KeyValue因此您必须指定淘汰赛必须查询的文件名,以获取相对值并将其放在屏幕上。

所以更改<strong data-bind="text: Name"><strong data-bind="text: Key">,这应该对你有用。

于 2013-09-29T13:44:12.957 回答