郁闷!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 相关文章推荐
js 巧妙去除数组中的重复项
Jan 25 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
May 18 Javascript
使用Jquery打造最佳用户体验的登录页面的实现代码
Jul 08 Javascript
解析javascript 实用函数的使用详解
May 10 Javascript
jquery操作复选框checkbox的方法汇总
Feb 05 Javascript
深入学习JavaScript中的Rest参数和参数默认值
Jul 28 Javascript
Node.js与Sails ~项目结构与Mvc实现及日志机制
Oct 14 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
Bootstrap导航简单实现代码
Mar 06 Javascript
bootstrap多层模态框滚动条消失的问题
Jul 21 Javascript
jquery实现动态改变css样式的方法分析
May 27 jQuery
vue props 一次传多个值实例
Jul 22 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
ThinkPHP模型详解
2015/07/27 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
json 定义
2008/06/10 Javascript
学习ExtJS 访问容器对象
2009/10/07 Javascript
js 动态选中下拉框
2009/11/26 Javascript
js变换显示图片的实例
2013/04/16 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
axios异步提交表单数据的几种方法
2019/08/11 Javascript
使用python编写监听端
2018/04/12 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
python利用ffmpeg进行录制屏幕的方法
2019/01/10 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
python实现在线翻译
2020/06/18 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
使用django自带的user做外键的方法
2020/11/30 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
Python tkinter之Bind(绑定事件)的使用示例
2021/02/05 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
学校政风行风整改方案
2014/10/25 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
离婚案件上诉状
2015/05/23 职场文书