郁闷!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 相关文章推荐
Javascript代码混淆综合解决方案-Javascript在线混淆器
Dec 18 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
js QQ客服悬浮效果实现代码
Dec 12 Javascript
jQuery实现设置、移除文本框默认值功能
Jan 13 Javascript
js数组常用操作方法小结(增加,删除,合并,分割等)
Aug 02 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
简单快速的实现js计算器功能
Aug 17 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
Jan 08 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
JavaScript实现放大镜效果代码示例
Apr 29 Javascript
利用JavaScript写一个简单计算器
Nov 27 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中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
Yii框架日志操作图文与实例详解
2019/09/09 PHP
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
JavaScript 动态加载脚本和样式的方法
2015/04/13 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
微信小程序开发注意指南和优化实践(小结)
2019/06/21 Javascript
jQuery实现滑动星星评分效果(每日分享)
2019/11/13 jQuery
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python获取标准北京时间的方法
2015/03/24 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Python最火、R极具潜力 2017机器学习调查报告
2017/12/11 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python实现简单加密解密机制
2019/03/19 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
python求最大值最小值方法总结
2019/06/25 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python关于变量名的基础知识点
2020/03/03 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
德国网上宠物店:Zoobio
2018/05/23 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
2014年党员承诺书范文
2014/05/20 职场文书
真诚的求职信
2014/07/04 职场文书
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python