C# 使用knockout访问序列化字典数据
使用javascript从序列化的C# 使用knockout访问序列化字典数据,c#,asp.net-mvc,dictionary,knockout.js,C#,Asp.net Mvc,Dictionary,Knockout.js,使用javascript从序列化的字典访问数据时遇到一些问题。下面的json是my Serialized dictionary的输出 生成的JSON是: items: { "Books":{ "Type":2, "Count":20547 }, "Games":{ "Type":1, "Count":2647 }, "Films":{ "Type":0, "C
字典
访问数据时遇到一些问题。下面的json是my Serialized dictionary的输出
生成的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>
使用c#,我可以通过使用items[“Books”]
访问特定键的值。使用敲除是否可以实现这一点?在如何访问其属性方面,其行为类似于字典(更确切地说是关联数组)。例如,这样做:
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中使用它,就不能使用observatarray
,因为它需要一个JavaScript数组,其成员通过索引访问。也就是说,上一个示例中的items
对象是具有属性的对象,而不是JavaScript数组
所以,在ko中,你需要使用一个可观察的,像这样:
var obs = ko.observable(items);
var items = [
{ Name: 'Books', Type: 2, Count: 20547 },
{ Name: 'Games', Type: 1, Count: 2647 }
];
但是,此可观察对象仅在整个项
对象发生更改时通知更改,而不会在其任何属性(如书籍
)被修改时通知更改。如果您需要在某些属性更改时获取通知(例如udpta视图),那么您需要使属性本身可观察,而不是仅根对象项
。要做到这一点,您可以使用插件,或手动执行。这相当于:
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)
})
});
在这种情况下,每当任何属性发生更改时,都会通知您
但是,如果您在添加或删除诸如书籍
、或游戏
之类的属性时需要通知,那么在ko中就不会有这样的直接方法。你需要将你的对象映射到一个常规的可观测数组,并制作一个ko.observableARay
,使其工作。映射可以如下所示:
var obs = ko.observable(items);
var items = [
{ Name: 'Books', Type: 2, Count: 20547 },
{ Name: 'Games', Type: 1, Count: 2647 }
];
如果这样做,您可以创建一个可观察的数组。如果仍然需要通过Name
访问属性,可以使用JavaScript方法(取决于浏览器支持的EcmaScript版本)或使用类似或的库,它提供了访问和映射JavaScript对象和集合的强大方法
注意:ko表达式能够检测到某个事物是可观察的,并展开其值。但是,如果需要访问可观察对象的observabe属性,则必须在所有级别中使用括号,但最后一个级别除外,例如data bind=“value:items().Books().Type”,如果使用了ko映射,或者按照上一个级别之前的代码块中的说明对其进行了映射。如果您需要更多信息,请阅读以下内容:.
选项.项目.书籍
?您发布的代码毫无意义。它充其量是不完整的,如果我想象一下完整的图片可能是什么样子,我会说您在创建observableArray
时有一个KO错误,为它提供了一个非数组。请在代码中完整描述您的情况(请参阅“”以获取指导)。