我正在使用AngularJS来渲染我的页面。我需要有2个具有相同数据的选择器,所以我使用了一个控制器。数据应该由GET请求接收,我想添加一个默认选择的额外选项。我已经尝试通过将响应与<span>b</br>e</span>
这样的选项连接来添加它,但尝试失败了。
很明显,应该在html中添加选项。下面的代码会创建一个合适的选择列表,但{id:-1, name:"All"}.concat($scope.dfleets)
似乎没有效果,并且在页面加载时没有选择任何项目。
html page
selectCtrl.selectedValue = selectCtrl.defaultValue.id
js code
<div ng-controller="SelectController as selectCtrl">
<select ng-model="selectCtrl.selectedValue" class="form-control" id="selectFleet_1" ng-init="showDriversFleets()">
<option value="selectCtrl.defaultValue.id">{[{selectCtrl.defaultValue.name}]}</option>
<option ng-repeat="value in selectCtrl.values" value="{[{value.id}]}">{[{value.name}]}</option>
</select>
答案 0 :(得分:1)
使用ng-options并在select元素中添加一个空的默认值选项 -
<select ng-options="...">
<option value="">Select Value</option>
</select>
OR
如果要在指定的集合中选择选项,则 -
Plunker - https://plnkr.co/edit/ApMlLTLOXfJKKutcEuFW?p=preview
angular.module('app', [])
.controller('ctrl', function($scope, $http) {
var urlBase = 'countries.json';
$scope.register = {};
$scope.register.countryId = "-1";
$scope.register.countries = [];
$scope.showDriversFleets = function() {
$http.get(urlBase).success(CreateCountryList);
}
function CreateCountryList(res) {
angular.forEach(res, function(item) {
$scope.register.countries.push(item);
});
$scope.register.countries.insert(0, {
"id": "-1",
"name": "Select Country"
});
}
Array.prototype.insert = function(index, item) {
this.splice(index, 0, item);
};
})
答案 1 :(得分:1)
以下是两种可行的方式的示范性演示 https://plnkr.co/edit/xx8ZjBdy55sgyIYdcNAw?p=preview
我首先使用更复杂的方法,让您更多地自定义选择下拉列表。
我想它应该在一个单独的指令中。它需要在控制器中进行更多的机动,而不是我认为的良好形式。
我当然不是专家 - 不一定确定最佳实践
我包含的第二个版本更接近文档中的内容,所以也许您应该使用该方法。
<html ng-app="selectListNgDefault">
<head>
<title>Check-box to toggle list</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"> </script>
<script src="selectListAngularSO.js"></script>
<style type="text/css" media="screen">
.left{ background-color: pink; width: 250px; height: 150px; display: inline-block; float: left;}
.right{ background-color: beige; width: 250px; height: 150px; display: inline-block; float: left;}
.demonstration{display:inline-block; border: 1px solid black; clear: both;}
.processing-message{width: 500px; background-color: yellow; display:inline-block; border: 1px solid black; clear: both;}
</style>
</head>
<body ng-controller="defaultAllSelectListCtrl" ng-init="checkedList=true">
<div class="demonstration">
<div class="left">
<h3>Using ng-repeat for selection</h3>
<label >Select a Fleet</label>
<select ng-init="selectedFleet=dfleets[0].id" ng-model="selectedFleet" ng-change="handleFleetSelectionFromString(selectedFleet)">
<option ng-repeat="fleet in dfleets" value="{{fleet.id}}" >{{fleet.brand}}({{fleet.cars}})</option>
</select>
<p>There are {{dfleets.length - 1}} fleet brands</p>
</div>
<div class="right">
<h1><em>{{selectedFleetFromId.brand}}</em> Drivers</h1>
<h2>Have {{selectedFleetFromId.cars}} cars!</h2>
</div>
</div>
<div class="demonstration">
<div class="left">
<h3>Using ng-options for selection</h3>
<label >Select a Fleet</label>
<select ng-init="ngOptionsSelectedFleet=dfleets[0]" ng-model="ngOptionsSelectedFleet" ng-options="v.brand for (k,v) in dfleets" ng-change="handleFleetSelection(ngOptionsSelectedFleet)"></select>
</div>
<div class="right">
<h1>{{ngOptionsSelectedFleet.brand}} Drivers</h1>
<h2>Have {{ngOptionsSelectedFleet.cars}} cars!</h2>
</div>
</div>
<br>
<div ng-hide="hideProcessingMessage" class="processing-message">
Alert: {{processingMessage}}
</div>
</body>
</html>
以下是js文件
var app = angular.module('selectListNgDefault', []) ;
app.controller('defaultAllSelectListCtrl', function ($scope, $http) {
var dummyData = [{id: "id1", brand: "Ford", cars: 12},{ id: "id2", brand: "Volkswagen", cars: 11},{id: 'id3', brand: "Mercedes", cars: 6},{id:"id4", brand: "Toyota", cars: 2},{id: "id5", brand: "Honda", cars: 19}];
$scope.hideProcessingMessage = true;
$scope.showDriversFleets = function() {
// $http.get('/api/driver/fleets/').then(function (res) {
// return angular.forEach(res.data, function (item) {
// return $scope.dfleets.push(item);
// });
// });
$scope.dfleets = [];
let totalCars = 0;
dummyData.forEach(function(fleet){
$scope.dfleets.push(fleet);
totalCars+= fleet.cars;
});
//alphabetize first?
$scope.dfleets.sort(function(a,b){return (a.brand < b.brand ) ? -1 : 1;});
//insert your custom default to appear giving it an arbitrary id?
$scope.dfleets.unshift({id: "idAll", brand: "All Fleets'", cars: totalCars});
// initialize display if you're using more detailed ng-repeat approach
$scope.selectedFleetFromId = {id: "idAll", brand: "All Fleets'", cars: totalCars}
};
$scope.handleFleetSelection = function(fleet){
$scope.hideProcessingMessage=false;
$scope.processingMessage = "Congratulations, your " + fleet.brand + " representative will contact you soon";
}
$scope.handleFleetSelectionFromString = function(fleetIdString){
$scope.selectedFleetFromId = $scope.dfleets.find( (fleet) => fleetIdString === fleet.id );
$scope.hideProcessingMessage=false;
$scope.processingMessage = "Congratulations, your " + $scope.selectedFleetFromId.brand + " representative will contact you soon";
}
$scope.showDriversFleets();
})
我希望我的想法可以帮助你进一步提升,即使它们并不完美。 :)
此前的SO帖子讨论了使用带有角度的选择框...不完全是您的默认问题,但值得一看。 how to use ng-option to set default value of select element