使用敲除访问串行字典数据

本文关键字:字典 数据 访问 | 更新日期: 2023-09-27 18:29:45

使用javascript从串行Dictionary<string, CustomType>访问数据时遇到一些问题。下面的json是我的序列化字典的输出。

生成的JSON是:

items: 
{
    "Books":{
        "Type":2,
        "Count":20547
    },
    "Games":{
        "Type":1,
        "Count":2647
    },
    "Films":{
        "Type":0,
        "Count":57213
    }
};

在我的javascript文件中,我创建了一个可观察的:

ko.observable(items)

在我看来,我遇到的问题是访问这些信息。我需要根据"key"值动态检索数据。我尝试过使用:

@{ var key = Model.Key; }
<p data-bind="text: items[@key].Count"></p>

然而,我得到以下错误:

Uncaught ReferenceError: Unable to process binding "text: function (){return items[Film].Count }"
Message: Film is not defined

使用c#,我可以使用items["Books"]访问特定密钥的值。有可能通过敲除来实现这一点吗?

使用敲除访问串行字典数据

JavaScript对象在如何访问其属性方面表现得像字典(更确切地说是关联数组)。例如:

var items = {};
items.Books = { "Type":2, "Count":20547 };
items.Games = { "Type":1, "Count":2647 };

完全等同于:

var items = {};
items["Books"] = { "Type":2, "Count":20547 };
items["Games"] = { "Type":1, "Count":2647 };

当然,您也可以使用此语法来读取值:

var books = items["Books"];

只要在ko中使用它,就不能使用observableArray,因为它需要一个JavaScript数组,其成员通过索引访问。即,上一个示例中的items对象是一个具有属性的对象,而不是JavaScript数组。

所以,在ko中,你需要使用一个可观察性,像这样:

var obs = ko.observable(items);

但是,这种可观察的结果只会在整个items对象更改时通知更改,而不会在其任何属性(如Books)更改时通知。如果您需要在其中一些属性更改时获得通知(例如udpta视图),那么您需要使属性本身可观察,而不仅仅是根对象items。要做到这一点,你可以使用ko.mapping插件,也可以手动进行。这相当于做:

var items = ko.observale({
    Books: ko.observable({
      Type: ko.observable(2), 
      Count: ko.observable(20547)
    }),
    Games:  ko.observable({
      Type: ko.observable(1), 
      Count: ko.observable(2647)
    })
});

在这种情况下,每当任何属性发生更改时,都会发出通知。

然而,如果您在添加或重新创建BooksGames这样的属性时需要通知yu,那么在ko中就没有直接的方法可以这样工作了。您需要将对象映射到一个规则的可观察数组,并使ko.observableArray使其工作。映射可能是这样的:

var items = [
  { Name: 'Books', Type: 2, Count: 20547 },
  { Name: 'Games', Type: 1, Count: 2647 }
];

如果这样做,就可以创建一个可观察的数组。如果您仍然需要通过Name访问属性,您可以使用JavaScript方法(取决于浏览器支持的EcmaScript版本)或使用lodash或下划线等库,它提供了访问和映射JavaScript对象和集合的强大方法。

注意:ko表达式能够检测到某个事物是可观察的,并打开其值。然而,如果你需要访问一个可观察对象的可观察属性,你必须在所有级别中使用括号,但在最后一个级别中,例如databind="value:items().Books().Type",如果你使用了ko映射,或者按照最后一个之前的代码块中的解释进行映射。如果您需要更多信息,请阅读以下内容:在数据绑定表达式中何时使用或不使用带可观测度的括号。