我正在尝试使用angularjs学习MVC单页面应用程序(SPA),我不知道如何在其中实现级联下拉列表。任何帮助表示赞赏。
提前致谢,
Naga Phaneendra。
答案 0 :(得分:2)
我认为您希望在级联下拉列表中支持Ajax。 这个指向JSFIDDLE的链接包含了使用Ajax和Static列表级联DDL的好例子。 http://jsfiddle.net/annavester/Zd6uX/
级联DDL的Html:
<div ng-controller="AjaxCtrl">
<h1>AJAX - Oriented</h1>
<div>
Country:
<select id="country" ng-model="country" ng-options="country for country in countries">
<option value=''>Select</option>
</select>
</div>
<div>
City: <select id="city" ng-disabled="!cities" ng-model="city" ng-options="city for city in cities"><option value=''>Select</option></select>
</div>
<div>
Suburb: <select id="suburb" ng-disabled="!suburbs" ng-model="suburb" ng-options="suburb for suburb in suburbs"><option value=''>Select</option></select>
</div>
如您所见,我们使用ng-options填充DDL中的数据。 DDL将在$ scope中返回所选对象。所以不要担心如何处理将出现在DDL选项中的id和title。
接下来的控制器代码如下:
function AjaxCtrl($scope) {
$scope.countries = ['usa', 'canada', 'mexico', 'france'];
$scope.$watch('country', function(newVal) {
if (newVal) $scope.cities = ['Los Angeles', 'San Francisco'];
});
$scope.$watch('city', function(newVal) {
if (newVal) $scope.suburbs = ['SOMA', 'Richmond', 'Sunset'];
});
}
如您所见,我们使用$ watch来观察DDL的变化。 替换这行代码
if (newVal) $scope.cities = ['Los Angeles', 'San Francisco'];
使用激发Ajax请求的代码来选择基于newVal.ID的数据,并使用$ http.get
填充城市结果答案 1 :(得分:1)
大多数情况下,这种菜单是通过生成某种嵌套的html结构(通常是<ul>
和<li>
标签)来完成的,然后应用样式表和一些javascript来显示或隐藏孩子元素直到被点击。这个在线有十亿个例子,所以我将把这个答案集中在如何生成嵌套的html(这是很难的部分)上。
您可以使用递归ng-repeat
和内联模板来完成此操作。
首先,您需要在您的范围内使用某种树模型。
var app = angular.module('menuApp', []);
app.controller('MenuController', function($scope) {
$scope.menu = [
{
label : "Main Menu",
url: "#/main",
children: [
{ label: "First Child", url: "#/main/1" },
{ label: "Second Child", url: "#/main/2",
children: [
{ label: "First Grandchild", url: "#/main/2/1" },
{ label: "Second Grandchild", url: "#/main/2/2" }
]
},
{ label: "Third Child", url: "#/main/3",
children: [
{ label: "Third Grandchild", url: "#/main/3/3" },
{ label: "Fourth Grandchild", url: "#/main/third/fourth",
children: [
{ label: "First Great-Grandchild", url: "#/main/3/4/1" },
{ label: "Second Great-Grandchild", url: "#/main/3/4/2" }
]
}
]
}
]
}
];
});
现在在你看来,你可以做到。
<ul ng-controller="MenuController">
<li ng-repeat="item in menu" ng-include="'menu-tree.html'"></li>
</ul>
<script type="text/ng-template" id="menu-tree.html">
<a href="{{item.url}}">{{item.label}}</a>
<ul>
<li ng-repeat="item in item.children" ng-include="'menu-tree.html'"></li>
</ul>
</script>
这是一个工作示例的链接。 http://plnkr.co/edit/V6aVx0JeBFwrUgPZs0vw?p=preview