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