2016-12-10 8 views
0

私はAngularJSを使用してページをレンダリングしています。私は同じデータを持つ2つのセレクタを持つ必要があるので、私はコントローラを使用します。データはGETリクエストで受信する必要があります。デフォルトで選択されている追加のオプションを追加します。私はすでに{id:-1, name:"All"}.concat($scope.dfleets)のようなオプションで応答を連結してこれを追加しようとしましたが、その試みは失敗しました。 オプションはhtmlの中に追加するべきです。以下のコードは適切な選択リストを作成しますが、selectCtrl.selectedValue = selectCtrl.defaultValue.idは効果がないと思われ、ページの読み込み時にアイテムが選択されていません。AngularJS - デフォルトの選択オプションを設定する方法

htmlページ

<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> 

jsのコード

dApp.controller('SelectController', ['$scope', '$http', function ($scope, $http){ 

$scope.showDriversFleets = function() { 
    $scope.dfleets = []; 

    $http.get('/api/driver/fleets/').then(function (res) { 
     return angular.forEach(res.data, function (item) { 
      return $scope.dfleets.push(item); 
     }); 
    }); 
} 

var selectCtrl = this; 
selectCtrl.defaultValue = {id:-1, name:"All"} 
selectCtrl.values = $scope.dfleets; 
selectCtrl.selectedValue = selectCtrl.defaultValue.id; 
}]); 
+0

ng-initで試しましたか? – Sajeetharan

+0

私はすでにng-initをデフォルトで設定することになっていました – NomaD

答えて

1

ここでは https://plnkr.co/edit/xx8ZjBdy55sgyIYdcNAw?p=preview

を仕事ができる2つの方法のplunkerデモで私はより複雑に持っていますメソッドを最初に選択ドロップダウンをよりカスタマイズすることができます。

私はそれが別の指令にあるべきだと思います。それは私が良い形だと思うよりもコントローラでより多くの操縦が必要でした。

私は確かに専門家ではない -

のベストプラクティスについては、私には、第二のバージョンはので、おそらくあなたがそのメソッドを使用する必要があり、そのドキュメントにあったものに近づく必ずしもわかりません。

<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(); 


}) 

ファイルである私は私のアイデアは、あなたが、彼らは完璧でなくても少しさらに得るのを助ける願っています。 :)

この前の記事では、あなたのデフォルトの質問ではありませんが、見る価値のある角度のある選択ボックスの使用について説明しています。 how to use ng-option to set default value of select element

+0

詳細ソリューションをありがとう – NomaD

1

使用NG-オプションとして選択要素内の空のデフォルト値オプションを追加 -

<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); 
    }; 
    }) 
+0

ありがとう、私は選択のアイデアをキャッチしますが、どのように '{" id ": - 1、" name ":"すべての国 " http.getリクエストでは割り当てられていませんが、デフォルトで選択する必要がありますか? – NomaD

+0

あなたの要件に基づいてコードを更新しました。見てください。 –

+0

すてきで簡単な解決策! – NomaD

関連する問題