• angularjs select ng-options延迟更新(联动)


    在使用angularjs的ng-options时,在后台更改了scope里对应的数组后,前段的select里的option不会马上更新,而是选择了某项后才会更新

     <label class="item item-input item-select">
        <div class="input-label">
          大类
        </div>
         <select ng-model="selected2" id="test" ng-options="sh.Type1Name for sh in list" ng-change="c2()" >
                 <option value="">--请选择--</option>
         </select>
      </label>
      
      
       <label class="item item-input item-select">
        <div class="input-label">
          小类
        </div>
       
       <select ng-model="selected3" ng-options="x.Type2Name for x in list1">
                 <option value="">--请选择--</option>
            </select>
      </label>

    JS

     $scope.list=function(){
         $.ajax({
                            type:"post",
                          contentType: "application/json; charset=utf-8",
                            async:false,
                  url:ip+"/Data/List",
                             dataType:"jsonp",
                             jsonp: 'callback',//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)  
                             data:{},
                           success: function (data) {
                    
                          $scope.list = data.list;
                        
                          $scope.c2 = function () {
                          
                              //获取select对象
                          var myselect = document.getElementById('test');
                          //获取选中项的索引
                          var index = myselect.selectedIndex; 
                          var json = data.list;
                          var type1id = json[index-1]["Type1Id"];
                          
                          jQuery.ajax({
                              type:"post",
                              contentType: "application/json; charset=utf-8",
                                    async:false,
                                    url:ip+"/Data/ListType?Type1Id="+type1id,
                                    dataType:"jsonp",
                                    jsonp:'callback',
                                    data:{},
                                    success:function(data){
                                        $scope.list1=data.list;
                                        //强制更新
                                        $scope.$apply();
                                    }
                                   
                          });
                         
                             
                          };
    
                
                           }
        
        });
     }

    JSON后台返回格式

    ({"list":[{"Type1No":"01","Type1Name":"市政","Type1Id":"6f9619ff-8b86-d011-b42d-00c04fc964ff"},{"Type1No":"02","Type1Name":"消防","Type1Id":"6f9619ff-8b86-d011-b42d-00c08fc964fe"},{"Type1No":"03","Type1Name":"其它","Type1Id":"6f9619ff-8b86-d011-b42d-00c14fc964ff"}]})

    问题分析


    其实并不是"在更改了select里的选项后才更新",而是因为响应了sites事件后的数据更新操作被没有被视图得知。因为你的socket实际是个游离在$scope之外的操作,所以双向绑定在这里没有生效。

    那为什么"在更改select之后"它却刷新了呢?原因也简单,因为你这次的操作又重新回到了$scope的生命周期之中,所以双向绑定监测到了$scope.options的变化。

    解决方法超简单,就是强制通知angular你的数据更新了:

    $scope.options = [{name:'aa',id:1},{name:'bb',id:2}];//初始化时候的值
    socket.on('sites',function(data){
            $scope.options = data;//socket.io更新该值
            $scope.$apply(); //强制通知
        });

    关键点


     $scope.$apply(); 

    //默认第一次加载数据
     $scope.list();
  • 相关阅读:
    避免Node.js中回调地狱
    XSS和CSRF攻击
    浅析SPDY
    移动端的图片优化
    js中的事件委托技术
    js的5种继承方式——前端面试
    深入理解前端跨域问题的解决方案——前端面试
    javascript中“use strict”的好处和坏处
    Http请求中POST与GET的区别——前端面试
    滚动条离底部的距离小于某个值
  • 原文地址:https://www.cnblogs.com/zry2510/p/6085390.html
Copyright © 2020-2023  润新知