郁闷!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 getElementsByClassName 和js取地址栏参数
Jan 02 Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 Javascript
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
Dec 01 Javascript
JavaScript实现时间倒计时跳转(推荐)
Jun 28 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
Jul 06 Javascript
jQuery实现一个简单的轮播图
Feb 19 Javascript
Angular2 路由问题修复详解
Mar 01 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
JavaScript实现数值自动增加动画
Dec 28 Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 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
一个多文件上传的例子(原创)
2006/10/09 PHP
让你的网站首页自动选择语言转跳
2006/12/06 PHP
一个捕获函数输出的函数
2007/02/14 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
javascript url几种编码方式详解
2016/06/06 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
Vuex简单入门
2017/04/19 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
利用node 判断打开的是文件 还是 文件夹的实例
2019/06/10 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
python使用PythonMagick将jpg图片转换成ico图片的方法
2015/03/26 Python
Python使用zip合并相邻列表项的方法示例
2018/03/17 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python设置代理和添加镜像源的方法
2020/02/14 Python
开启Django博客的RSS功能的实现方法
2020/02/17 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
怎样从/向数据文件读/写结构
2014/11/23 面试题
毕业生个人投资创业计划书
2014/01/04 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
活动总结怎么写
2014/04/28 职场文书
英语课外活动总结
2014/08/27 职场文书
2014年共青团工作总结
2014/12/10 职场文书
电力工程合作意向书
2015/05/11 职场文书
2015年工商所工作总结
2015/05/21 职场文书
python实现局部图像放大
2021/11/17 Python