2017-06-22 76 views
0

我正在使用Angular(1.6.4)選擇一個網站上工作。如果第一次請求,則select元素的內容將通過REST加載。但是REST調用的響應被緩存,以便後面的調用從內存中加載數據。如果我加載網站的select元素是空的,我不能選擇任何值。如果我使用緩存的數據再次訪問站點,則選擇框允許您從列表中選擇項目。如果我將REST調用重定向到包含第一次嘗試的數據的文件,我可以按預期方式選擇項目角度選擇不更新,如果模型更改

所以看起來代碼原則上工作正常,但如果模型更新太晚,select元素會沒有注意到這些變化。

這裏是我使用的代碼:

<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)添加

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

設置dataArray中的該功能內或稱之爲手錶功能的內部。在這兩種情況下,我得到的摘要已更新或使控制檯上的錯誤,這表明它時並不需要使用範圍。$應用設置dataArray中的=數據後

2)使用

$scope.onChange($scope.dataArray); 

不幸的是沒有工作。如果我取消註釋:

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

我可以選擇加載頁面,並選擇視圖後,該條目則顯示dataArray中的第一項,並事後我可以訪問整個列表,並從中選擇項目。

所以我想知道我能做些什麼來在數據可用後更新選擇視圖。通過添加一個監聽器或手動調用select視圖來更新(),refesh()等等。有沒有這樣的功能?

+0

工程細https://plnkr.co/edit/mLZRxl4fektVAGnLGaAJ?p =預覽)。 – georgeawg

回答

1

您可以通過一些boolean標誌,這臺true,當加載 數據show您選擇的元素。

你可以做下面的代碼。

在控制器:

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

在HTML:

<select ng-if="isDataLoaded" ng-model="myData" ng-class="select-chosen" 
     ng-options="myData as myData.value for myData in dataArray"> 
</select> 
在[這個DEMO上PLNKR](
+0

謝謝,它沒有解釋爲什麼它不起作用。但它是一個有用的解決方法。 – mgerbracht

+0

原因可能是瀏覽器沒有完成渲染,直到它在控制器中分配的時間,另一個替代方案可能會將'get'調用包裝在'$ timeout'中。 – anoop