次の Angular select2 コントローラーがあるとします。
<select ui-select2 id="projectListSelection" data-placeholder="Select a Project ..." ng-model="selectedProject">
@*ng-options="project.WebsiteName for project in projectList"*@
<option value=''></option>
<option ng-repeat="project in projectList" ng-value="'{{ project.WebsiteGUID }}'">{{project.WebsiteName}}</option>
</select>
モデル データは、コントローラーから次のように取得されます。
$scope.projectList = dataFactory.getList("") // no parameters
.success(function (result) {
$scope.projectList = result.value;
$("#projectListSelection").select2({ width: '240' });
})
.error(function (error) {
customUIFunctions.showError("Data Error - Unable to Load Project List"); // use default error message
console.log("data error");
});
問題は次のとおりです。
- コントロールが最初に画面に表示されたときは、昔ながらの
select
ドロップダウン コントロールのように見えます - 一瞬、幅が 0 になる
- コントロールの UI は、コントロールのように見えるように再び更新されますが、
select2
その幅はプレースホルダーと同じくらい小さいだけです。 - コントロールにデータがロードされた後、240px にサイズ変更されます
データが取得される前 (前$scope.projectList = ...
) に幅を設定しようとすると、次のエラーが発生します。
Select2 s2id_projectListSelection に対してクエリ関数が定義されていません ... angular.js:9402 RangeError: 最大コール スタック サイズを超えました ...
DOM が完全にロードされていないため、これは理にかなっています。そう...
$(document).ready(function () {
$("#projectListSelection").select2({ width: '240' });
});
ただし、幅が最初にプレースホルダーに準拠し、次にデータが読み込まれると幅の広い設定に準拠するという同じ問題がまだ見られます。
私はこれを回避することができました:
<select ui-select2 id="projectListSelection" style="width:240px;" . . .
しかし、それはちょっと醜いです。
質問:
- データがロードされているかどうかに関係なく保持される幅オプションはありますか?
- 「データを読み込んでいます...」などのメッセージを表示してから、別のメッセージを表示できるプレースホルダーオプションはありますか? データがロードされたら「プロジェクトを選択してください...」?