angularjs select标签中ng-model无法在js controller中取值问题

<div class="col-md-4">					
  <label class="col-md-3">周次:</label>
  <ui-select class="col-md-9" ng-model="week" theme="bootstrap" ng-change='loadTable()'>
    <ui-select-match placeholder="选择周次" class="boNone"> 
      {{$select.selected}} 
    </ui-select-match>
    <ui-select-choices repeat="w in weeks | filter:$select.search "> 
      {{w}} 
    </ui-select-choices> 
  </ui-select>
</div>
$scope.loadTable = function() {
  alert($scope.week);
}

如上,weeks的值类似[1,2,3]这种结构,初始化代码略。使用angularjs的ui-select插件写了一个选择周次的下拉框,但使用时可以正常显示值,也可以正常选择,但选择后后台却不能取到正确的值,使用弹出框调试后发现$scope.week的值是undefined。

修改为以下代码后可以正常取值:

<div class="col-md-4">					
  <label class="col-md-3">周次:</label>
  <ui-select class="col-md-9" ng-model="params.week" theme="bootstrap" ng-change='loadTable()'>
    <ui-select-match placeholder="选择周次" class="boNone"> 
      {{$select.selected}} 
    </ui-select-match>
    <ui-select-choices repeat="w in weeks | filter:$select.search "> 
      {{w}} 
    </ui-select-choices> 
  </ui-select>
</div>
$scope.loadTable = function() {
  alert($scope.params.week);
}

原因:

1.由于原型继承的关系,修改父级对象中的someBareValue会同时修改子对象中的值,但反之则不行。

2.ng-if 以及 ng-repeat 会创建一个子级作用域,如果在这俩个指令中添加了元素,并增加ng-model指令,那么ng-model对应的作用域属于子级作用域,并非controller注入的$scope对应的作用域。

解决:

1.方法一:先定义一个params对象(名称随意),如$scope.params={},然后其他代码按照前面能正常使用的代码进行书写。

现对前面的例子进行分析,当直接定义在$scope下时,如果js中写了$scope.week=1,则页面加载后下拉框选中项会是1(例子中未定义week,故设置不成功时取值是undefined),这意味着父$scope中设置的值在子$scope中是生效的,因为子week继承自父week,然后点击下拉框选中2,这种情况下因为设置过了,弹出框不会再显示undefined了,但此时弹出框依然弹出1,这就意味着子$scope中设置的值不会对父$scope生效,符合前面分析的原因,即此时父$scope.week=1,子$scope.week=2(子对象已经改变了)。弹出的是父$scope.week的值。当将week定义为$scope中params对象的一个属性时,子params继承自父params,当修改子params中的week属性时(子对象并未改变,还是继承过来的那个对象),故修改的week会通过引用进行共享,因此在子$scope中修改属性也会修改父$scope中的这个属性。

2.方法二:js取值依然按照$scope.week取值,页面下拉框绑定数据修改为ng-model="$parent.week"。

此种方式将子作用域中的值直接绑定到父作用域中,故在js中能够直接使用。

实际使用建议使用方法一,否则当存在很多层作用域时容易出问题。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值