使用 Knockoutjs 进行数据绑定嵌套 JSON

发布于 2024-12-29 22:08:16 字数 265 浏览 2 评论 0原文

我有一个包含数组数组的 JSON 结构。我有一个视图模型,它使用包含 Observable 数据的 Observable 数组定义对象,然后将这些对象嵌套在其他数组和 Observable 中。

加载包含嵌套 Observable 数组(包含 Observable 数据)的视图模型的最简单方法是什么?

例子: http://jsfiddle.net/uyQb6/1/

I have a JSON structure containing arrays of arrays. I have a View Model that defines objects with Observable Arrays containing Observable data, and then nesting those objects in other Arrays and Observables.

What is the simplest way to load a View Model containing nested Observable Arrays containing Observable data?

Example:
http://jsfiddle.net/uyQb6/1/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

呆° 2025-01-05 22:08:16

您可以使用映射插件进行探索,但选项对象会变得复杂,因为每个创建回调都必须再次调用映射插件,然后添加任何依赖的Observables,并且使所有属性都可观察会更容易。

不过,您可以坚持使用构造函数,并使用诸如 ko.utils.arrayMap 之类的东西,它只是一个简单的函数,它循环遍历数组并将每个项目重新映射到从您提供的函数返回的任何内容。

以下是添加了 ko.utils.arrayMap 调用的示例:
http://jsfiddle.net/rniemeyer/VUfSS/

You could explore using the mapping plugin, but the options object would get complicated as each create callback would have to call the mapping plugin again and then add any dependentObservables and it would be easier to make all of the properties observables.

You can stick with your constructors though and use something like ko.utils.arrayMap, which is just a simple function that loops through an array and remaps each item to whatever you return from the function that you supply.

Here is your sample with the ko.utils.arrayMap calls added:
http://jsfiddle.net/rniemeyer/VUfSS/

如何视而不见 2025-01-05 22:08:16

更新:如果您的嵌套列表取决于主列表,这就是您的解决方案,否则 @rp-niemeyer 解决方案是最好的。

如果我做对了,可以说您有这样的 JSON 数据:

{
    appId: 1,
    appName: 'my app 1',
    modules:[
        {module1:1, moduleName: 'module 1'}, {module1:2, moduleName: 'module 2'}]
},
{
    appId: 2,
    appName: 'my app2',
    modules:[
        {module1:3, moduleName: 'module 3'}, {module1:4, moduleName: 'module 4'}]
}

这将成为你的 viewModel:

function myViewModel(){
    var self = this;
    self.appList = ko.observableArray(data);
    self.moduleList = ko.observableArray([]);

    // Set selectedApp in order to fill modulesList
    self.selectedApp = ko.observable();
    self.selectedApp.subscribe(function(v){
        // updates module list whenever selected app gets value.
        moduleList(v.modules);
    });
}

我没有测试它,但我确信你已经明白了。

Update: If your nested list is depend on main list this is your solution, otherwise @rp-niemeyer solution is the best.

If I got it right, lets say you have JSON data like this:

{
    appId: 1,
    appName: 'my app 1',
    modules:[
        {module1:1, moduleName: 'module 1'}, {module1:2, moduleName: 'module 2'}]
},
{
    appId: 2,
    appName: 'my app2',
    modules:[
        {module1:3, moduleName: 'module 3'}, {module1:4, moduleName: 'module 4'}]
}

This will be your viewModel:

function myViewModel(){
    var self = this;
    self.appList = ko.observableArray(data);
    self.moduleList = ko.observableArray([]);

    // Set selectedApp in order to fill modulesList
    self.selectedApp = ko.observable();
    self.selectedApp.subscribe(function(v){
        // updates module list whenever selected app gets value.
        moduleList(v.modules);
    });
}

I didn't test it but I'm sure you've got the idea.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文