郁闷!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 兼容多浏览器的回车和鼠标焦点事件代码(IE6/7/8,firefox,chrome)
Apr 14 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
Js的Array数组对象详解
Feb 22 Javascript
Javascript技术栈中的四种依赖注入小结
Feb 27 Javascript
JSONP基础知识详解
Mar 19 Javascript
Bootstrap模态框插入视频的实现代码
Jun 25 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
JavaScript满天星导航栏实现方法
Mar 08 Javascript
vuejs 动态添加input框的实例讲解
Aug 24 Javascript
VUE-cli3使用 svg-sprite-loader
Oct 20 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 Javascript
使用 JavaScript 制作页面效果
Apr 21 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反转字符串函数strrev()函数的用法
2012/02/04 PHP
windows下zendframework项目环境搭建(通过命令行配置)
2012/12/06 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
PHP版本常用的排序算法汇总
2015/12/20 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
微信小程序实现美团菜单
2018/06/06 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
JS中数组实现代码(倒序遍历数组,数组连接字符串)
2019/12/29 Javascript
javascript实现超好看的3D烟花特效
2020/01/01 Javascript
Vue父子传递实例讲解
2020/02/14 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
Python3对称加密算法AES、DES3实例详解
2018/12/06 Python
Python常用特殊方法实例总结
2019/03/22 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
Python DataFrame一列拆成多列以及一行拆成多行
2019/08/06 Python
python字符串的index和find的区别详解
2020/06/20 Python
解决Keras中CNN输入维度报错问题
2020/06/29 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
简历自我评价怎么写好呢?
2014/01/04 职场文书
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
建议书格式
2015/02/04 职场文书
2016年寒假见闻
2015/10/10 职场文书
Nginx同一个域名配置多个项目的实现方法
2021/03/31 Servers
Python实现照片卡通化
2021/12/06 Python
MySql分区类型及创建分区的方法
2022/04/13 MySQL