绑定 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">
还有:
不需要额外的 $data
前缀。
您的 SampleMenuData
将内部 Items
属性 定义为对象而不是数组。
见Documentation and updated Fiddle
我正在尝试基于 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">
还有:
不需要额外的
$data
前缀。您的
SampleMenuData
将内部Items
属性 定义为对象而不是数组。
见Documentation and updated Fiddle