郁闷!ionic中获取ng-model绑定的值为undefined如何解决_javascript技巧

今天在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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ionic
, model
, undefined
ng
ionic ng repeat、ionic ngcordova、ionic ng if、ionic ng model、ionic ng click,以便于您获取更多的相关知识。

时间: 2024-12-10 23:24:39

郁闷!ionic中获取ng-model绑定的值为undefined如何解决_javascript技巧的相关文章

Javascript中获取出错代码所在文件及行数的代码_javascript技巧

原先使用的是try-catch的方式,在catch语句中,我们会收到一个Error对象(我们也可以抛出一个自定义异常对象).Firefox中的Error对象拥有如下属性: message -- 错误提示信息 fileName -- 表示出错代码所在文件 lineNumber -- 出错代码所在行数 stack -- 出错堆栈信息 name -- 异常对象名/类型 但是在IE下,Error对象只有如下属性: name -- 异常对象名/类型,和Firefox中显示的名称可能不同 message -

JS中把字符转成ASCII值的函数示例代码_javascript技巧

字符转ascii码:用charCodeAt();ascii码转字符:用fromCharCode(); 看一个小例子 复制代码 代码如下: <script>str="A";code = str.charCodeAt(); str2 = String.fromCharCode(code);str3 = String.fromCharCode(0x60+26); document.write(code+'<br />');document.write(str2+'&l

页面中body onload 和 window.onload 冲突的问题的解决_javascript技巧

1.使用attachEvent给onload添加所需运行的函数 复制代码 代码如下: if (document.all) { window.attachEvent('onload', FuncName) } else { window.addEventListener('load', FuncName, false); } 2.使用window.onload = function(){FuncName1(); FuncName();},直接onload两个函数.可以加一个判断, 复制代码 代码如

javascript-怎么在js中获取gridview某一行的值并且赋给一个数组

问题描述 怎么在js中获取gridview某一行的值并且赋给一个数组 如题: 在网上找了这样一种方法,总是调不出来,各位大神给看看 首先在模板列中添加一个按钮用来选中行,页面有关代码如下: 25 26 <Columns> 27 <asp:TemplateField> 28 <ItemTemplate> 29 <input id="btnLocation" type="button" value="定位到"

sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别

原文:sql 中获取最后生成的标识值 IDENT_CURRENT ,@@IDENTITY ,SCOPE_IDENTITY 的用法和区别 IDENT_CURRENT 返回为任何会话和任何作用域中的指定表最后生成的标识值. 语法 IDENT_CURRENT('table_name') 参数 table_name 是将要返回其标识值的表的名称.table_name 的数据类型为 varchar,没有默认值. 返回类型 sql_variant 注释 IDENT_CURRENT 类似于 Microsoft

SSH框架 在jsp界面中获取后台request.put的值并进行判断代码书写

问题描述 SSH框架 在jsp界面中获取后台request.put的值并进行判断代码书写 在Action.java中设置了request.put("sql",0); 在jsp界面中通过<%=request.getAttribute("sql")%>来获取 我是想在jsp界面判断該值从而作出不同的操作 故写了 < s:if test="<%=request.getAttribute("sql")%>==0&q

c#窗体中获取选中的checkbox的值,并且将其值写入文本文件中

问题描述 c#窗体中获取选中的checkbox的值,并且将其值写入文本文件中 解决方案 解决方案二:this.Controls.OfType<CheckBox>().ToList().ForEach(p=>{stringcheckValue=p.Text;}); 解决方案三:web中可以使用Page.FindControl(id)

c#4 0-EasyUI 中获取下拉框的值

问题描述 EasyUI 中获取下拉框的值 在Html中点击Button按钮 ,获取到ComboBox的 valueField 解决方案 获取下拉框的值获取下拉框的值jquery获取下拉框的值 解决方案二: 例子:<select id="cc" class="easyui-combobox" name="cc" style="width:200px;">在对其取值的时候 //取ID $('#cc').combobox

JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法_javascript技巧

本文实例讲述了JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法.分享给大家供大家参考,具体如下: 主页面: <script type="text/javascript"> function SelectGroupCust() { var temp = window.showModalDialog("Default2.aspx?xx=" + Date(), "", "dialog