2017-06-22 8 views
0

角度(1.6.4)選択を使用するWebサイトで作業しています。 select要素の内容は、初めて要求された場合はREST経由でロードされます。しかし、REST呼び出しの応答はキャッシュされ、以後の呼び出しはメモリーからデータをロードします。ウェブサイトをロードすると、select要素は空であり、値を選択することはできません。データをキャッシュしてサイトに再度アクセスすると、リストから項目を選択することができます。 REST呼び出しをデータが入っているファイルにリダイレクトすると、最初の試行で動作し、予想どおりに項目を選択できますモデルが変更された場合、角度選択は更新されません

コードは原則として機能しますが、モデルがあまりにも遅く更新された場合、変更に気付かない。

<select ng-model="myData" chosen 
     class="select--chosen" 
     ng-change="handleSelection()" 
     ng-options="myData as myData.value for myData in dataArray"> 
</select> 

をコントローラコードは、この(サイトを開いたときに呼ばれる)のようになります:私はロード時に

$scope.dataArray = []; 
//$scope.dataArray = [{value : "just a test value"}]; 
$scope.$watch('dataArray ', function() {console.log("dataArray was changed...")}, true); 

getArray(); 

function getArray() { 
    DataFactory.getArray().then(function (data) { 
    $scope.dataArray = data; 
    }); 
} 

私は時計のメッセージを得るのです。ここ

は、私が使用していたコードです最初のサイトです。解決策を探すときに私はいくつかのヒントを見つけましたが、どれも私のために働いていませんでした。これは私が試したものです:

1)この関数内dataArrayを設定したり、時計機能の内部でそれを呼び出すために

$scope.$apply(function(){ /* code */ }); 

を追加します。どちらの場合も、私は、ダイジェストは、既に更新したりので、スコープを使用する必要ありませんであることを示してコンソールにエラーが発生しました。$

2を適用)dataArray =データを設定した後

$scope.onChange($scope.dataArray); 

を使用します。

残念ながら、何も機能しませんでした。私が行コメントを解除した場合:

$scope.dataArray = [{value : "just a test value"}]; 

を私はページをロードした後、この項目を選択することができますし、選択ビューは、dataArrayの最初のエントリを示し、その後、私は全体のリストにアクセスし、そこから項目を選択することができます。

私は、データが利用可能になった後に選択ビューを更新するために何ができるか知りたいと思います。リスナーを追加するか、selectビューを手動で呼び出してupdate()、refesh()などを実行します。そのような機能はありますか?

+0

ワークス微細https://plnkr.co/edit/mLZRxl4fektVAGnLGaAJ?p =プレビュー)。 – georgeawg

答えて

1

あなたの選択要素は、booleanフラグで指定することができ、と設定し、 データをロードします。

次のようなコードを入力できます。コントローラで

:HTMLで

$scope.dataArray = []; 
$scope.myData= null; 
$scope.isDataLoaded = false; //flag for data loading. 

function getArray() { 
    DataFactory.getArray().then(function (data) { 
    $scope.isDataLoaded = true; // make true now 
    $scope.dataArray = data.data; //your result might be data.data 
    $scope.myData = $scope.dataArray[0]; // you may select 1st as default 
    }); 
}  
getArray(); 

<select ng-if="isDataLoaded" ng-model="myData" ng-class="select-chosen" 
     ng-options="myData as myData.value for myData in dataArray"> 
</select> 
[PLNKRにこのデモ](中
+0

ありがとう、なぜそれが動作しないか説明しません。しかし、それは便利な回避策です。 – mgerbracht

+0

理由はブラウザがコントローラで割り当てられた時間までレンダリングを終了しない可能性があります。また、別の代替手段が '$ timeout'で' get'呼び出しをラップすることもできます。 – anoop

関連する問題