郁闷!ionic中获取ng-model绑定的值为undefined如何解决


Posted in Javascript onAugust 27, 2016

今天在ionic中使用ng-model时候,在对应的controller里面获得值为undefined。以前在使用angularjs的ng-model绑定时候就可以拿到的啊,这就尴尬了,决定一探究竟。大家先看下面的一个demo。

在学习angularjs的ng-model的数据双向绑定时候,我们通过以下的代码拿到对应的ng-model的值:


demo1

<div ng-app="myApp" ng-controller="myCtrl">
 名字: <input ng-model="name">
 {{name}}
 <button ng-click="show()">shoName</button>
</div>

 对应的js

<script>
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
 $scope.show=function(){
  console.log($scope.name);//可以正确的拿到页面上输入的值
  console.log(allPrpos($scope));
 };
 /*获取某个对象的属性*/
 function allPrpos(obj) { 
  // 用来保存所有的属性名称和值
  var props = "";
  // 开始遍历
  for(var p in obj){ 
   if(typeof(obj[p])=="function"){ // 方法
   //console.log(obj[p]);
   }else{ 
   // p 为属性名称,obj[p]为对应属性的值
   props += p + "=" + obj[p] + "; ";
   } 
  } 
  // 最后显示所有的属性
  console.log(props);
 }
});
</script>

通过打印$scope对象,看到其属性的确包含一个name的键值对。但是在在ionic项目的时候,我们同样是这样拿的:

demo2

<ion-view view-title="Chats">
 <ion-content>
  <div>
   名字: <input ng-model="name">
   {{name}}
   <button ng-click="show()">shoName</button>
  </div> 
 </ion-content>
</ion-view>

在ionic对应的controller.js的对应的ChatsCtrl:

angular.module('starter.controllers', [])
.controller('ChatsCtrl', function($scope) {
 $scope.show=function(){
  console.log($scope.name);//控制台打印undefined
  console.log(allPrpos($scope));
 };
});

在打印的$scope属性里面并未发现name,控制台打印undefined,页面上{{name}}却可以正常输出来,这是为何呢?估计很多ionic初学者在做项目中都遇到过这个情况,是不是angularjs的数据双向绑定在ionic中失效了?假如我这样写:


demo3

<ion-view view-title="Chats">
 <ion-content ng-controller="MyChatCtrl">
  <div>
   名字: <input ng-model="name">
   {{name}}
   <button ng-click="show()">shoName</button>
  </div> 
 </ion-content>
</ion-view>

在controller.js里面重新定义一个MyChatCtrl:

angular.module('starter.controllers', [])
.controller('MyChatCtrl', function($scope) {
 $scope.show=function(){//点击button
  console.log($scope.name);//控制台可以正常打印每次input输入框里面的值
  console.log(allPrpos($scope));
 };
});

这样大家应该就看出一些端倪了吧,其实一切问题的根源就是scope。当使用ng-model、ng-repeat等directive命令的时候,其本身会创建一个scope。其实,这涉及到ionic的controller创建时机问题,ionic视图路由里面创建的controller的scope的作用域要比下面的demo2中MyChatCtrl的scope的作用域要大;原来这两个scope是不同的,这也就解释了上面demo2为何拿到的值为undefind。发现问题了,如果解决这个问题呢?

scope作用域是可以继承的,js对象的属性也是继承的,所以我们可以稍微改下demo2,在刚才的ChatsCtrl先定义一个默认值:

var $scope.name={text:""};

在页面上input的ng-model:

<ion-view view-title="Chats">
 <ion-content ng-controller="MyChatCtrl">
  <div>
   名字: <input ng-model="name.text">
   {{name}}
   <button ng-click="show()">shoName</button>
  </div> 
 </ion-content>
</ion-view>

经过做如此处理后,再点击button发现可以正常打印$scope.name的值。如果你不想用对象的属性这样来做,你有可以把绑定的时候绑定到其父作用域的scope里面,demo2的ctrl不变,页面上的代码改为如下:

<ion-view view-title="Chats">
 <ion-content ng-controller="MyChatCtrl">
  <div>
   名字: <input ng-model="$parent.name">
   {{name}}
   <button ng-click="show()">shoName</button>
  </div> 
 </ion-content>
</ion-view>

这样同样可以拿到$scope.name的值,至此问题解决。ng-repeat等如果出现此问题,同样可以如此处理。大家如果有其他的解决方案,欢迎留言提出。  

参考文章

ionic的ng-model无法获取值问题
深入理解angularjs的scope

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery中ajax学习笔记一
Oct 16 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
浅谈jquery上下滑动的注意事项
Oct 13 Javascript
js 定位到某个锚点的方法
Nov 19 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
Jan 23 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
微信小程序 弹窗输入组件的实现解析
Aug 12 Javascript
Javascript地址引用代码实例解析
Feb 25 Javascript
JavaScript接口实现方法实例分析
May 16 Javascript
javascript+Canvas实现画板功能
Jun 23 Javascript
Vue时间轴 vue-light-timeline的用法说明
Oct 29 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 Javascript
ionic实现带字的toggle滑动组件
Aug 27 #Javascript
ionic实现可滑动的tab选项卡切换效果
Apr 15 #Javascript
ionic实现滑动的三种方式
Aug 27 #Javascript
js select实现省市区联动选择
Apr 17 #Javascript
轻松掌握JavaScript装饰者模式
Aug 27 #Javascript
node.js实现快速截图
Aug 27 #Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 #Javascript
You might like
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP使用数组实现队列
2012/02/05 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
js+CSS 图片等比缩小并垂直居中实现代码
2008/12/01 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
2011/07/31 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
AngularJs 国际化(I18n/L10n)详解
2016/09/01 Javascript
用iframe实现不刷新整个页面上传图片的实例
2016/11/18 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
对angular4子路由&amp;辅助路由详解
2018/10/09 Javascript
解决Angularjs异步操作后台请求用$q.all排列先后顺序问题
2019/11/29 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
vue计算属性+vue中class与style绑定(推荐)
2020/03/30 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
python实现的一个p2p文件传输实例
2014/06/04 Python
浅谈numpy数组的几种排序方式
2017/12/15 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
解决ROC曲线画出来只有一个点的问题
2020/02/28 Python
HTML5单页面手势滑屏切换原理
2016/03/21 HTML / CSS
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
生产部管理制度
2014/01/31 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
作风大整顿心得体会
2014/09/10 职场文书
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis