写点什么

AngularJS 进阶 (四十二)ng-options 渲染的第一项为空问题分析及解决方案

  • 2022-12-17
    江苏
  • 本文字数:1516 字

    阅读完需:约 5 分钟

AngularJS进阶(四十二)ng-options渲染的第一项为空问题分析及解决方案

一、问题描述

在使用ng-options时,如果首次使用,可能会在渲染完成后发现下拉列表的第一项为空,并且在选择一项之后,为空的第一项已经消失了,这样用户体验上来说很不好。

二、原因剖析

使用ng-options的时候,是配合模型指令ng-model一起使用的,从而我们就可以知道,渲染生成的第一项为空原因肯定和ng-model的初始值有关系。

三、解决办法

  • 可以在控制器中给ng-model的初始值设置为下拉选项中的某个值或对象;

  • 可以给select默认增加一项类似“请选择”的选项。

四、示例

控制器


var instsData ={    "result":"0000",    "errtext":"",    "data":[      {"instName":"中国银行","instCode":"000996"},      {"instName":"中国西电","instCode":"601179"},      {"instName":"中国重汽","instCode":"000951"}    ]};var results = instsData.data;$scope.inst = results[0];$scope.insts = results;
复制代码


<select id="selectInput" style="display:none"  ng-model="inst"  ng-options="inst.instCode as inst.instName for inst in insts" ng-change="doChange()">  <option value="">----请选择----</option></select>
复制代码


效果




五、拓展阅读 AngularJS 上拉加载问题解决方法

      项目中始终存在一个问题:当在搜索栏输入关键词后(见图 1),按照既定的业务逻辑应该是服务端接收到请求后,首先返回查询的前 7 条数据,待客户端出现上拉加载时,继续查找另外 7 条数据。但实际情形是不确定的,在服务端控制台(见图 2)可看到 begno 一直到了 126,也就是相当于客户端往服务端请求了 127 次,这是一个令人无法忍受的结果。



图 1 客户端搜索栏

 


图 2 服务端控制台

      可以断定是客户端的业务逻辑出现了问题。返回到客户端,查看源码逻辑,修改如下:

      控制器


$scope.medsearchMore = function() {console.log("上拉加载....." + isfinished);if (isfinished == 0) {begno += pcnt;var data = {"begno"   : begno,   // 起始序号"pagenum" : pagenum, // 每页返回条数"searchby": searchby};if (searchType == 1) {data.classid = searchKey;console.log(data.classid); //--------1appCallServer($http, "9002", data, function(data) {console.log("下拉刷新查询结果rootScope.med:" + JSON.stringify(data.data));for (var i = 0; i < data.pcnt; i++) {$rootScope.med.push(data.data[i]);}// 更新状态isfinished = data.isfinished;// 药品已查询完毕if(isfinished == '1'){$scope.noMore = true;}else{$scope.noMore = false;}pcnt = data.pcnt;}, function(data) {// 药品已查询完毕$scope.noMore = true;$ionicLoading.show({template: data.errtext});$timeout(function() {$ionicLoading.hide();}, 1200);});}} else {// 药品已查询完毕$scope.noMore = true;}$timeout(function() {$scope.$broadcast('scroll.infiniteScrollComplete');}, 1200);};
复制代码


      视图


<!--当用户到达页脚或页脚附近时,ion-infinite-scroll指令允许你调用一个函数 。当用户滚动的距离超出底部的内容时,就会触发你指定的on-infinite--><!--当没有更多数据加载时,就可以用一个简单的方法阻止无限滚动,那就是angular的ng-if指令--><!--设置noMore初始值为true首次即点击分类查询时不进行下拉加载操作--><ion-infinite-scroll on-infinite="medsearchMore()" distance="0.01%" icon="ion-loading-c"></ion-infinite-scroll><div class="item" ng-if="noMore" align="center"><p>没有更多的药品了</p></div>
复制代码


      经过以上修改,可以实现避免不必要的请求。



六、参考文献

 

发布于: 刚刚阅读数: 3
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
AngularJS进阶(四十二)ng-options渲染的第一项为空问题分析及解决方案_12月月更_No Silver Bullet_InfoQ写作社区