Angularjs 如果模型更改,则选择不更新

Angularjs 如果模型更改,则选择不更新,angularjs,select,view,model,Angularjs,Select,View,Model,我在一个使用Angular(1.6.4)Select的网站上工作。如果第一次请求,则通过REST加载select元素的内容。但是REST调用的响应是缓存的,以便后续调用从内存加载数据。如果我加载网站,select元素为空,我无法选择任何值。如果我再次访问缓存了数据的站点,selectbox允许您从列表中选择项目。如果我将REST调用重定向到一个包含数据的文件,它将在第一次尝试时工作,并且我可以按预期选择项 因此,代码似乎在原则上起作用,但是如果模型更新得太晚,select元素不会注意到更改 以下

我在一个使用Angular(1.6.4)Select的网站上工作。如果第一次请求,则通过REST加载select元素的内容。但是REST调用的响应是缓存的,以便后续调用从内存加载数据。如果我加载网站,select元素为空,我无法选择任何值。如果我再次访问缓存了数据的站点,selectbox允许您从列表中选择项目。如果我将REST调用重定向到一个包含数据的文件,它将在第一次尝试时工作,并且我可以按预期选择项

因此,代码似乎在原则上起作用,但是如果模型更新得太晚,select元素不会注意到更改

以下是我正在使用的代码:

<select ng-model="myData" chosen
        class="select--chosen"
        ng-change="handleSelection()"
        ng-options="myData as myData.value for myData in dataArray">
</select>
当我第一次加载站点时,我确实收到了监视消息。在寻找解决方案时,我发现了一些提示,但没有一个对我有效。这就是我所尝试的:

1) 加

在该函数内设置dataArray或在watch函数内调用它。在这两种情况下,我在控制台上都得到了一个错误,即摘要已经在更新,这表明不需要使用scope。$apply

2) 使用

设置dataArray=data之后

不幸的是,一切都不起作用。如果我取消对该行的注释:

$scope.dataArray = [{value : "just a test value"}];
我可以在加载页面后选择这个条目,然后选择视图显示dataArray的第一个条目,然后我可以访问整个列表并从中选择项目


因此,我想知道在数据可用后如何更新select视图。通过添加侦听器或手动调用select view to update()、refesh()等。有这样一个功能可用吗?

您可以
通过一些
boolean
标志来显示您的select元素,当 数据已加载

您可以执行类似以下代码的操作

在控制器中:

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


在中工作正常。谢谢,它没有解释为什么不工作。但这是一个有用的解决方法。原因可能是浏览器在控制器中指定的时间之前没有完成渲染,另外一个替代方法可能是将
get
调用包装在
$timeout
中。
<select ng-if="isDataLoaded" ng-model="myData" ng-class="select-chosen"
        ng-options="myData as myData.value for myData in dataArray">
</select>