郁闷!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 相关文章推荐
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
判断文档离浏览器顶部的距离的方法
Jan 08 Javascript
jquery选择checked在ie8普通模式下的问题
Feb 12 Javascript
举例详解JavaScript中Promise的使用
Jun 24 Javascript
原生js实现水平方向无缝滚动
Jan 10 Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 Javascript
浅析node.js的模块加载机制
May 25 Javascript
移动端如何用下拉刷新的方式实现上拉加载
Dec 10 Javascript
vue2.0自定义指令示例代码详解
Apr 25 Javascript
vue中使用element组件时事件想要传递其他参数的问题
Sep 18 Javascript
javascript简单实现深浅拷贝过程详解
Oct 08 Javascript
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
Jun 29 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中的use关键字概述
2014/07/23 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
js 使FORM表单的所有元素不可编辑的示例代码
2013/10/17 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
2013/11/26 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
js根据手机客户端浏览器类型,判断跳转官网/手机网站多个实例代码
2016/04/30 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
深入理解js generator数据类型
2016/08/16 Javascript
javascript表单控件实例讲解
2016/09/13 Javascript
ReactNative页面跳转实例代码
2016/09/27 Javascript
ES6中的Promise代码详解
2017/10/09 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
使用JS模拟锚点跳转的实例
2018/02/01 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
原生JS实现旋转轮播图+文字内容切换效果【附源码】
2018/09/29 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Python编程中运用闭包时所需要注意的一些地方
2015/05/02 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
Python configparser模块常用方法解析
2020/05/22 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
梅花魂教学反思
2014/04/25 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
党员教师四风自我剖析材料
2014/09/30 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
培训感想范文
2015/08/07 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
Python类方法总结讲解
2021/07/26 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android