Javascript 仅当对象类型为数组时,如何使用ng repeat?
我有一个复杂的对象,如下所示:Javascript 仅当对象类型为数组时,如何使用ng repeat?,javascript,angularjs,arrays,Javascript,Angularjs,Arrays,我有一个复杂的对象,如下所示: $scope.document = { "GENERAL_FIELDS": { "Source_Type": "custom", "Annotations": [ "216/content/Factiva_CM_001/Proteins", "216/content/Factiva_CM_001/Fact" ], "Content": [ " Baculovirus; Budded v
$scope.document =
{
"GENERAL_FIELDS": {
"Source_Type": "custom",
"Annotations": [
"216/content/Factiva_CM_001/Proteins",
"216/content/Factiva_CM_001/Fact"
],
"Content": [
" Baculovirus; Budded virus; Ultrastructure; Cryo-EM;"
],
"Title": [
"Budded baculovirus particle structure revisited"
]
},
"stn": {
"Document_Type": [
"Journal",
"Article"
]
}
}
我想显示“常规字段”和“stn”中的所有字段。字段的值可以是字符串或字符串数组。如果它是数组,我还想在它上面重复并显示内容。以下是我的html:
<div id="titsec" class="comdocdet" ng-repeat="(category, group) in document">
<div ng-repeat="(key, value) in group">
<div class="pTitle">
{{key}}
</div>
<div class="contdesc">
<div ng-if="Array.isArray(value)">
<div ng-repeat="v in value">
{{v}}
</div>
</div>
<div ng-if="!Array.isArray(value)">
{{value}}
</div>
</div>
</div>
</div>
{{key}}
{{v}
{{value}}
但是
ng if=“Array.isArray(value)”
永远不会为真,数组字段以对象形式显示:[“Journal”,“Article”]
。我遗漏了什么?不应该直接在模板中访问数组对象上的方法,而应该在控制器中执行。例如:
<div ng-if="vm.isValueAnArray(value)">
// Some html
</div>
我还没有测试它,但是逻辑应该在控制器中,而不是在模板中。您应该在控制器中执行操作,而不是直接在模板中访问数组对象上的方法。例如:
<div ng-if="vm.isValueAnArray(value)">
// Some html
</div>
我还没有测试它,但是逻辑应该在控制器中,而不是在模板中。这是一个范围问题
模板的范围与控制器中的$scope
相关,因此当它查找数组时,将在控制器范围中查找该数组(例如$scope.Array
)
一个选项是使用ng if=“window.Array.isArray(value)”
。请参见下面的工作示例
另一个选项是在控制器中设置$scope.Array=Array.prototype
。这样,在调用Array.isArray()
之前就不需要引用窗口
另一个选项是在控制器作用域中为创建别名:
$scope.isValueAnArray=Array.isArray代码>
然后调用该函数以确定该值是否为数组
angular.module('ang',[])
.controller('cont',函数($scope){
//使用此选项可避免引用模板中的窗口
//$scope.Array=Array.prototype;
$scope.document={
“常规字段”:{
“源类型”:“自定义”,
“注释”:[
“216/content/Factiva_CM_001/Proteins”,
“216/内容/事实/事实”
],
“内容”:[
杆状病毒;出芽病毒;超微结构;冷冻电镜
],
“标题”:[
“芽接杆状病毒粒子结构再探讨”
]
},
“stn”:{
“文档类型”:[
“日记”,
“文章”
]
}
}
});代码>
{{key}}
{{v}
{{value}}
这是一个范围界定问题
模板的范围与控制器中的$scope
相关,因此当它查找数组时,将在控制器范围中查找该数组(例如$scope.Array
)
一个选项是使用ng if=“window.Array.isArray(value)”
。请参见下面的工作示例
另一个选项是在控制器中设置$scope.Array=Array.prototype
。这样,在调用Array.isArray()
之前就不需要引用窗口
另一个选项是在控制器作用域中为创建别名:
$scope.isValueAnArray=Array.isArray代码>
然后调用该函数以确定该值是否为数组
angular.module('ang',[])
.controller('cont',函数($scope){
//使用此选项可避免引用模板中的窗口
//$scope.Array=Array.prototype;
$scope.document={
“常规字段”:{
“源类型”:“自定义”,
“注释”:[
“216/content/Factiva_CM_001/Proteins”,
“216/内容/事实/事实”
],
“内容”:[
杆状病毒;出芽病毒;超微结构;冷冻电镜
],
“标题”:[
“芽接杆状病毒粒子结构再探讨”
]
},
“stn”:{
“文档类型”:[
“日记”,
“文章”
]
}
}
});代码>
{{key}}
{{v}
{{value}}
或将其添加到控制器中,并保持其余部分不变
$scope.isArray = angular.isArray;
html将如下所示:
<div ng-if="isArray(value)">
<div ng-repeat="v in value">
{{v}}
</div>
</div>
<div ng-if="!isArray(value)">
{{value}}
</div>
{{v}
{{value}}
或将其添加到控制器中,并保持其余部分不变
$scope.isArray = angular.isArray;
html将如下所示:
<div ng-if="isArray(value)">
<div ng-repeat="v in value">
{{v}}
</div>
</div>
<div ng-if="!isArray(value)">
{{value}}
</div>
{{v}
{{value}}
value.length--将给出字符串的长度以及value.length--我也会给出绳子的长度谢谢伙计!这是我的工作。但为什么它不能从模板中工作?@ManojSuthar在我更新的回答中看到解释谢谢伙计!这是我的工作。但是为什么它不能从模板中工作呢?@ManojSuthar在我更新的答案中看到了解释