ngRepeat、JSON、angularJS-不允许重复-通过指令中的模板
ngRepeat, JSON, angularJS - duplicates are not allowed - via template in directive
更新:
我发现,如果我在控制器中传递JSON文件,如下所示:
controller('dynamicMenuCtrl', ['$scope', function ($scope) {
$scope.mainmenu2 = [
{
"id": "bananas",
"title": "Bananas",
"href": "#/bananas",
"li-class": "menu-element"
},
{
"id": "apples",
"title": "Apples",
"li-class": "dropdown"
"submenu": [
{
"id": "apple-lot",
"title": "Apples lots",
"href": "#/apples/lot"
},
{
"id": "apple-series",
"title": "Apples series",
"href": "#/apples/series"
}
]
},
{
"id": "cherries",
"title": "Cherries",
"href": "#/cherries",
"li-class": "menu-element"
}
]
});
而不是通过$http.get 获取
我的导航栏工作正常。我在HTML中称之为:
<li ng-repeat=item in mainmenu2>"
更新2:如果你使用MVC应用程序,你必须在Web.config
中register JSON
文件
<system.webServer>
<staticContent>
<mimeMap fileExtension=".json" mimeType="application/json; charset=UTF-8"/>
</staticContent>
</system.webServer>
那一切都会好起来的
我有个问题,我有一个JSON文件:
{
"mainmenu": [
{
"id": "bananas",
"title": "Bananas",
"href": "#/bananas",
"li-class": "menu-element"
},
{
"id": "apples",
"title": "Apples",
"li-class": "dropdown"
"submenu": [
{
"id": "apple-lot",
"title": "Apples lots",
"href": "#/apples/lot"
},
{
"id": "apple-series",
"title": "Apples series",
"href": "#/apples/series"
}
]
},
{
"id": "cherries",
"title": "Cherries",
"href": "#/cherries",
"li-class": "menu-element"
}
]
}
我想用这个JSON文件制作一个导航栏。我使用AngularJS来实现这一点(在这种情况下只允许使用Angular(。
我制作了一个控制器来获取这个JSON文件:
angular.module('dynamic-menu').controller('dynamicMenuCtrl', ['$scope', '$http', function ($scope, $http) {
$http.get('MenuItems.json').success(function (data) {
$scope.mainmenu = data;
});
然后我想在我的HTML:中制作一个导航栏
<nav class="navbar navbar-inverse navbar-fixed-top" role="navigation" id="nav-bar" style="margin-bottom: 0.5%">"
<div class="container-fluid">
<div class="navbar-header">
<span class="navbar-brand">TITLE</span>
</div>
<div class="collapse navbar-collapse">
<span class="navbar-brand">
<ul class="nav navbar-nav">
<li ng-repeat="item in mainmenu">
<a href="{{item.href}}">{{item.title}}</a>
</li>
</ul> <!-- /.nav navbar-nav -->
</span> <!-- /.navbar-brand -->
</div> <!-- /.navbar-collapse-->
</div> <!-- /.container-fluid-->
</nav>
然后我得到一个错误错误:
[ngRepeat:dupes] Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: item in mainmenu, Duplicate key: string:<, Duplicate value: "<"
我尝试使用表达式trackby $index
,但它没有以我想要的方式呈现。有很多东西的复制品,但我不知道出了什么问题。也许我的JSON文件或Controller中有问题?
编辑:你能看到并编辑这个plunkr吗http://plnkr.co/edit/U1xG2E4ys7SGz7WxBtvq?p=preview
它也不起作用,也许我写错了什么?我还在这篇文章中更正了我的JSON文件,以及错误表达式
第2版:如果我想通过指令制作HTML怎么办
angular.module('dynamic-menu').directive('menuTemplate', function () {
return {
restrict: 'E',
template: "<nav class='"navbar navbar-inverse navbar-fixed-top'" role='"navigation'" id='"nav-bar'" style='"margin-bottom: 0.5%'">"
+ "<div class='"container-fluid'">"
+ "<div class='"navbar-header'">"
+ "<span class='"navbar-brand'">TITLE</span>"
+ "</div>"
+ "<div class='"collapse navbar-collapse'">"
+ "<span class='"navbar-brand'">"
+ "<ul class='"nav navbar-nav'">"
+ "<li ng-repeat='"item in mainmenu'">"
+ "<a href='"{{item.href}}'">{{item.title}}</a>"
+"</li>"
+"</ul> <!-- /.nav navbar-nav -->"
+"</span> <!-- /.navbar-brand -->"
+"</div> <!-- /.navbar-collapse-->"
+"</div> <!-- /.container-fluid-->"
+"</nav>"
};
}]);
第3版:我更新了我的plunkr,现在它正在工作:
http://plnkr.co/edit/U1xG2E4ys7SGz7WxBtvq?p=preview
我还创建了一个指令,它也起作用。我不知道为什么它在Plunkr中工作,但在我的项目中没有:(
您正在获取的数据是一个对象,该对象包含一个mainmenu
键,该键是对象数组。因此,在您的控制器中使用:
$http.get('MenuItems.json').success(function (data) {
$scope.mainmenu = data.mainmenu;
});
此外,您的mainmenu
数组包含一些对象,这些对象没有href
和title
值,但它具有submenu
属性(数组也是(,该属性包含href
和标题values
。
使用此:
<li ng-repeat="item in mainmenu track by $index">
<a ng-if="!item.submenu" href="{{item.href}}">{{item.title}}</a>
<a ng-if="item.submenu">{{item.title}}
<ul ng-repeat="subitem in item.submenu">
<li>
<a href="{{subitem.href}}">{{subitem.title}}</a>
</li>
</ul>
</a>
</li>
而不是这个
<span ng-repeat="motto in mottos"> {{motto}} </span>
试试这个
<span ng-repeat="motto in mottos track by $index"> {{motto}} </span>
你可以在这个页面上看到更多的细节
附言:这可能是堆栈溢出问题的重复问题
您的代码中很少有问题:
1( JSON无效。这是有效的JSON:
{
"mainmenu": [
{
"id": "bananas",
"title": "Bananas",
"href": "#/bananas",
"li-class": "menu-element"
},
{
"id": "apples",
"title": "Apples",
"li-class": "dropdown",
"submenu": [
{
"id": "apple-lot",
"title": "Apples lots",
"href": "#/apples/lot"
},
{
"id": "apple-series",
"title": "Apples series",
"href": "#/apples/series"
}
]
},
{
"id": "cherries",
"title": "Cherries",
"href": "#/cherries",
"li-class": "menu-element"
}
]
}
2( $scope.mainmenu
本身有一个mainmenu
密钥,它是数组,因此在mainmenu
密钥上重复为:
<li ng-repeat="item in mainmenu.mainmenu">
编辑:使用$http.get
获取json。
请参阅plunkr:"http://plnkr.co/edit/Kcl2uVeWg03bawagdQpm?p=preview">
- 一次显示一个隐藏指令-AngularJS
- 一次显示一个指令AngularJS
- 在同一页面上多次使用的自定义指令 (AngularJS) 中的验证
- 无法绑定到没有指令 + angularjs 标识符的控制器
- 值未传递给指令-AngularJS
- 测试依赖于另一个指令Angularjs的指令
- 根据指令angularjs 1.2分配控制器
- 有模板问题的指令.AngularJS
- 编译指令在指令 AngularJS 中
- 我可以将 templateUrl 传递给指令 - AngularJS
- 从子指令的父指令 [angularJS] 触发子指令中的函数
- 将服务注入指令 AngularJS 和数据绑定
- 在指令 AngularJS 中解析
- 从指令 AngularJS 给出高图表正确的参数
- 获取 JSON 数据并传递给指令 Angularjs
- 点击事件后的渲染模板指令 - AngularJs
- 如何从分页指令angularjs隐藏直接页面链接
- AngularJS-关闭tile并从ngRepeat指令AngularJS中的模型加载新视图
- 触发指令AngularJs的控制器作用域
- 将定义的对象传递给另一个自定义指令angularjs