绑定 javascript 数组对象以使用 knockout 查看

Binding javascript array object to view using knockout

我正在尝试基于 json 对象呈现菜单,但 link 未呈现。

function MenuItem(item) {

    this.id = item.id;
    this.name = item.name;
    this.url = item.url;
    this.parentid = item.parentid,
    this.isSelected = ko.observable(item.isSelected);
    this.userRoles = item.userRoles;

    if (item.Items) {
        this.Items = ko.observableArray($.map(item.Items, function (i) {
            return new MenuItem(i);
        }));
    }
    else {
        this.Items = ko.observableArray();
    }
}


function MenuViewModel(root) {

    var self = this;

    self.Root = new MenuItem(root);
}

function SampleMenuData() {
    return {
        id: 0,
        name: "Root",
        url: null,
        parentid: null,
        isSelected: false,
        userRoles: null,
        Items: [
            {
                id: 1,
                name: "Home",
                url: "/home/index",
                parentid: 0,
                isSelected: true,
                userRoles: null,
                Items: {
                },
            },
            {
                id: 4,
                name: "Products",
                url: "/products/index",
                parentid: 0,
                isSelected: false,
                userRoles: null,
                Items: {
                },
            },
        ],
    };
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<h2>Menu</h2>
<nav data-bind="visible: Root.Items().length > 0">
    <ul data-bind="foreach: Root.Items()">
        <li>
            <a data-bind="attr: { href: url, text: name }">
            </a>
        </li>
        <ul data-bind="foreach: Items()">
            <li>
                <a data-bind="attr: { href: $data.url, text: $data.name}"> </a>
            </li>
        </ul>
    </ul>
</nav>

<script>
    $(function() {

        var vm = new MenuViewModel(SampleMenuData());
        ko.applyBindings(vm);        
    });
</script>

如果我使用类似的东西:

<li data-bind="text: name">  
</li>

它会正确显示 name 的值,但实际上我需要根据 url 属性 创建 link。你可以在这里看到例子:http://jsfiddle.net/430szwu2/1/

知道为什么这行不通吗?

谢谢。

您错误地将 text 设置为 attr 绑定处理程序值的一部分。试试这个:

<a data-bind="attr: { href: url }, text: name">

还有:

  1. 不需要额外的 $data 前缀。

  2. 您的 SampleMenuData 将内部 Items 属性 定义为对象而不是数组。

Documentation and updated Fiddle