郁闷!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 相关文章推荐
W3C Group的JavaScript1.8 新特性介绍
May 19 Javascript
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
javascript整除实现代码
Nov 23 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
Apr 25 Javascript
javascript中的throttle和debounce浅析
Jun 06 Javascript
详解jQuery中的事件
Dec 14 Javascript
jquery实现tab键进行选择后enter键触发click行为
Mar 29 jQuery
JavaScript中一些特殊的字符运算
Aug 17 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
Jan 24 Javascript
js实现json数组分组合并操作示例
Feb 12 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 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 获取百度的热词数据的代码
2012/02/18 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
js右键菜单效果代码
2007/07/21 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
jQuery实现跨域
2015/02/03 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
VUE实现密码验证与提示功能
2019/10/18 Javascript
vue实现整屏滚动切换
2020/06/29 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
Python高级应用实例对比:高效计算大文件中的最长行的长度
2014/06/08 Python
python套接字流重定向实例汇总
2016/03/03 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
Python中使用多进程来实现并行处理的方法小结
2017/08/09 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
2018/05/10 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
Django发送邮件功能实例详解
2019/09/02 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
Pytorch 实现计算分类器准确率(总分类及子分类)
2020/01/18 Python
python代码xml转txt实例
2020/03/10 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
英国航空官网:British Airways
2016/09/11 全球购物
美国户外生活方式品牌:Eddie Bauer
2016/12/28 全球购物
教师读书笔记
2015/06/29 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang