gpt4 book ai didi

javascript - 如果绑定(bind)在 KnockoutJS 中不起作用,则为无容器

转载 作者:行者123 更新时间:2023-12-03 07:18:28 24 4
gpt4 key购买 nike

我最近想显示一个特定的属性(如果已定义),如果未定义,我想显示一个 DIV 元素及其上的一些说明。

但我无法弄清楚;我尝试过使用 $root 甚至是它的绑定(bind)属性,但没有成功。

这是我的代码示例:

function InvestigatorInfo() {
var self = this;
self.Name = ko.observable();
self.Description = ko.observable();
self.TypeName = ko.observable();
self.AssemblyName = ko.observable();
self.ResultType = ko.observable();
self.EnumTypeName = ko.observable();
self.Obsolete = ko.observable();
self.InvestigatorType = ko.observable();

self.Properties = ko.observable();
self.Requires = ko.observable();
}
InvestigatorInfo.prototype.fromJS = function(data) {
var self = this;
self.Name(data.Name || "");
self.Description(data.Description || "");
self.TypeName(data.TypeName || "");
self.AssemblyName(data.AssemblyName || "");
self.ResultType(data.ResultType || "");
self.EnumTypeName(data.EnumTypeName || "");
self.Obsolete(data.Obsolete || "");
self.InvestigatorType(data.InvestigatorType || "");

self.Properties(data.Properties.Properties || []);
self.Requires(data.Requires.Interfaces || []);
}

还有我的索引:

<ul class="collapsible" data-collapsible="accordion" data-bind="foreach:InvestigatorInfos">
<li>
<div class="collapsible-header">
<i class="material-icons">view_quilt</i>
<p class="blue-text" data-bind="text: TypeName"></p>
</div>
<div class="collapsible-body">

<p class="style_p_row" ><b>AssemblyName:</b> <span data-bind="text: AssemblyName"></span></p>
<!-- ko if:Description -->
<p class="style_p_row" ><b>Description:</b> <span data-bind="text: Description"></span></p>
<!-- /ko -->
<!-- ko if:EnumTypeName -->
<p class="style_p_row" >
<b>EnumTypeName: </b><span data-bind="text: EnumTypeName"></span></p>
<!-- /ko -->
<p class="style_p_row" >
<b>InvestigatorType:</b> <span class="investigatortype-class" data-bind="text:investigatorName[InvestigatorType]"></span></p>
<p class="style_p_row" ><b>Name: </b><span data-bind="text: Name"></span></p>
<!-- ko if:Obsolete -->
<p class="style_p_row" ><b>Obsolete: </b><span data-bind="text: Obsolete"></span></p>
<!-- /ko -->
<p class="style_p_row" ><b>TypeName: </b><span data-bind="text: TypeName"></span></p>
<!-- ko if:ResultType -->
<p class="style_p_row" ><b>ResultType: </b><span data-bind="text: resultName[ResultType]"></span></p>
<!-- /ko -->

<!-- ko ifnot:Properties-->
<p class="blue-text padding_p">Properties</p>
nothing is set
<!-- /ko -->
<!-- ko if: Properties-->
<table class="bordered">
<thead>
<tr>
<th data-field="Name">Name</th>
<th data-field="Converter">Converter</th>
<th data-field="ValidationName">ValidationName</th>
<th data-field="EnumTypeName">EnumTypeName</th>
</tr>
</thead>
<tbody data-bind="foreach: Properties">
<tr>
<td><span data-bind="text: Name"></span>
</td>
</tr>
</tbody>
</table>
<!-- /ko -->
</div>
</li>
</ul>

ko if: Properties 中的 Properties 部分始终显示,即使其后面的数组中没有值,而不是 中定义的元素ko ifnot: 属性.

JSON 数据:

{
"BrickInfos": {
"BrickInfos": [
{
"Properties": {
"Properties": [

]
},
"Implements": {
"Interfaces": [
{
"TypeName": "ITSR2.Bricks.Access.IAccessBareBoneBrick"
},
{
"TypeName": "ITSR2.Bricks.Access.IAccessAppBrick"
}
]
},
"Name": "AccessBareBoneApp",
"Description": "",
"TypeName": "ITSR2.Bricks.Access.AccessBareBoneApp",
"AssemblyName": "ITSR2.Bricks.MSOffice, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null",
"Obsolete": false
},
{
"Properties": {
"Properties": [
{
"Name": "MainFile",
"Description": "",
"ValidationType": 4,
"Converter": 8,
"EnumTypeName": ""
}
]
},
"Implements": {
"Interfaces": [
{
"TypeName": "ITSR2.Bricks.Access.IAccessBrick"
},
{
"TypeName": "ITSR2.Bricks.Access.IAccessAppBrick"
}
]
},
"Name": "AccessFile",
"Description": "",
"TypeName": "ITSR2.Bricks.Access.AccessFile",
"AssemblyName": "ITSR2.Bricks.MSOffice, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null",
"Obsolete": false
},
]
}
}

最佳答案

您的 Properties 属性是一个 observable,看起来它包含一个数组,并且可以设置为 data.Properties.Properties 或空数组 ([])。

[]"truthy" value ,因此即使代码已将 [] 分配给 Properties, knockout if 绑定(bind)也会将其视为已填充。您需要检查它的长度:

<!-- ko if:Properties().length == 0-->

注意 () - 我们需要调用 observable 来获取底层数组 - observable 本身没有 length 属性。

关于您的更新,以Obsolete 为例,您传递的是false。这意味着:

<!-- ko if: Obsolete -->

永远不会显示它的内容,因为它显然是错误。您需要将其调整为您期望的值 - 因为您将默认值设置为 "",所以您可以检查一下:

<!-- ko ifnot: Obsolete() === "" -->

因此,如果它是一个空白字符串,它将不会显示,其他任何内容都会显示。您的每个属性都需要进行类似的检查,具体取决于您传递给它们的内容以及您想要显示的任何“有效”值是否最终会被视为虚假值。

关于javascript - 如果绑定(bind)在 KnockoutJS 中不起作用,则为无容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36309149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com