郁闷!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 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
jquery子元素过滤选择器使用示例
Jun 24 Javascript
jQuery中:enabled选择器用法实例
Jan 04 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
Apr 21 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
vuejs手把手教你写一个完整的购物车实例代码
Jul 06 Javascript
react-native使用react-navigation进行页面跳转导航的示例
Sep 07 Javascript
mui上拉加载更多下拉刷新数据的封装过程
Nov 03 Javascript
JavaScript中0、空字符串、'0'是true还是false的知识点分享
Sep 16 Javascript
vue 使用v-for进行循环的实例代码详解
Feb 19 Javascript
详解JavaScript的计时器和按钮效果设置
Feb 18 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 字符串分割和比较
2009/10/06 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
2014/11/22 PHP
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
Node.js的MongoDB驱动Mongoose基本使用教程
2016/03/01 Javascript
基于jquery实现图片放大功能
2016/05/07 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
微信小程序-getUserInfo回调的实例详解
2017/10/27 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
django简单的前后端分离的数据传输实例 axios
2020/05/18 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
vant-ui AddressEdit地址编辑和van-area的用法说明
2020/11/03 Javascript
Python模拟百度登录实例详解
2016/01/20 Python
Python循环结构的应用场景详解
2019/07/11 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
New Balance波兰官方商城:始于1906年,百年慢跑品牌
2017/08/15 全球购物
澳大利亚在线高跟鞋商店:Shoe Me
2019/11/19 全球购物
C# .NET面试题
2015/11/28 面试题
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
跟单业务员岗位职责
2014/03/08 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
Python网络编程之ZeroMQ知识总结
2021/04/25 Python
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python