郁闷!ionic中获取ng-model绑定的值为undefined如何解决
今天在ionic中使用ng-model时候,在对应的controller里面获得值为undefined。以前在使用angularjs的ng-model绑定时候就可以拿到的啊,这就尴尬了,决定一探究竟。大家先看狼蚁网站SEO优化的一个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的作用域要比狼蚁网站SEO优化的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等如果出现此问题,同样可以如此处理。大家如果有其他的解决方案,欢迎留言提出。
参考文章
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程