ionic 搜索双向数据绑定失效

1.用data对象存储变化的数据

js:

$scope.data={};
$scope.data.keywords = "";
$scope.search = function(){
	$state.go("search",{keywords:$scope.data.keywords});
}

html:

<ion-view view-title="Home" hide-nav-bar="true">
		<ion-header-bar class="bar-dark" align-title="center">
		</ion-header-bar>
		<ion-content ng-controller="homeCtrl">
		<div class="item item-input-inset">
		    <label class="item-input-wrapper">
		      <input type="text" placeholder="搜索" ng-model="data.keywords">
		    </label>
		    <button class="button button-small ion-ios-search-strong" ng-click="search()">
		    </button>
		</div>
		</ion-content>
</ion-view>

2.把路由定义中的controller去掉,直接在模板文件中的ion-content上显示声明ng-controller="homeCtrl",这样之前的代码就能起作用。

双向数据绑定失效的原因:

首先,在ionic路由中定义了模板文件的controller后,ionic会在加载模板文件后,在模板文件的最顶级dom上(也就是ion-view)创建你的controller作用域$scope,然后由于ionic在我页面上的ion-content没有找到我显示声明的ng-controller,所以他会自动创建了一个匿名的作用域$scope2(这里我认为是ionic的内部机制会在ion-content上默认创建一层作用域,并没有真的研究过),那么因为我的controller中定义了keywords,实际上这里是$scope.keywords,但是页面上实际显示的其实是$scope2.keywords,这个值并没有定义,根据angular的作用域继承关系,$scope2.keywords= $scope.keywords,当我改变该值的时候,变化的是$scope2.keywords,但是这时候$scope.keywords这个值是并没有变化的。所以我在controller里面获取的$scope.keywords没有变化。

那么为什么按上面2种方法修改可以解决这个问题呢?
首先当我把keywords改成了data.keywords后,$scope2继承的就是是$scope的data对象,而熟悉js的同学都知道,修改$scope2.data对象中的引用则$scope.data也会改变,所以这种方法可以使2层作用域中的值同时改变,在controller中获取到的值就是界面上一样的值了。
第二种方法去掉了路由中定义的controller,直接写在模板中的ion-content上,这样模板文件加载进来后,就只有ion-content上的一层作用域了,双向数据绑定当然就起作用了。(如果ng-controller写在模板文件的ion-view上,依然是没用的,所以我猜想ionic是会自动在ion-content上创建作用域)

参考文献:https://link.zhihu.com/?target=https%3A//github.com/xufei/blog/issues/18

时间: 2024-10-05 04:01:29

ionic 搜索双向数据绑定失效的相关文章

(八)简单了解下angularJS框架中NB的双向数据绑定机制,大大减少需要重复的开发代码量

之前写的第一篇angularJS入门文章 ,介绍ng-model的时候提到:使用angularJS的双向数据绑定机制,不需要我们编写繁琐的代码来实现同样的功能.现在我们看一个比较震撼的例子,看看angularJS是如何减少我们在前端开发中的繁琐劳动的.越是感受到框架功能的强大,越是能够激发学习的兴趣和动力. 假如我们有一个学生信息列表,包含学生的姓名.地址和年龄信息.假如这个数据源信息保存在data.js文件中. var g_phones = [ <span style="white-sp

Vue中的双向数据绑定简单介绍

1. 文本框绑定v-module 1 <div id="app"> 2 <input type="text" v-model="msg" value="666"> // 表单使用v-mode时value会失效 3 {{msg}} 4 </div> 5 6 <script src="js/vue.js"></script> 7 <script&

第四 表单指令 v-model 双向数据绑定

表单指令 v-model 双向数据绑定 <!-- v-model 双向数据绑定 后台的框架模式 MVC (单向的) M model 模型  数据 V view  视图 C  controller 控制器 MVVM(双向的) M model 模型 数据 <=> V view 视图 VM view-model  视图模型 (相当于controller 控制器) MVVM模式 M-model 模型-数据   V-view 视图-浏览器 VM-viewModel 视图模型-控制器 模型通过控制器

双向数据绑定和单项数据绑定的认识

参考文章: https://segmentfault.com/q/1010000002511449/a-1020000002514653 https://www.zhihu.com/question/49964363/answer/136022879 单向数据绑定:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面. 单向数据绑定缺点:HTML代码一旦生成完以后,就没有办法再变了,如果有新的数据来了,那就必须把之前的HT

vue双向数据绑定原理探究(附demo)

昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与UI层的同步,数据再两者之间的任一者发生变化时都会同步更新到另一者. 双向绑定的一些方法 目前,前端实现数据双向数据绑定的方法大致有以下三种: 1.发布者-订阅者模式(backbone.js) 思路:使用自定义的data属性在HTML代码中指明绑定.所有绑定起来的JavaScript对象以及DOM元

angularjs学习笔记--主html&amp;template html&amp;module&amp;template js、模块、控制器、双向数据绑定、过滤器

// Register the `phoneList` component on the `phoneList` module, angular. module('phoneList'). component('phoneList', {...}); // Define the `phonecatApp` module angular.module('phonecatApp', [ // ...which depends on the `phoneList` module 'phoneList'

angular和vue双向数据绑定

angular和vue双向数据绑定的原理(重点是vue的双向绑定) 我在整理javascript高级程序设计的笔记的时候看到面向对象设计那章,讲到对象属性分为数据属性和访问器属性,我们平时用的js对象90%以上都只是用到数据属性;我们向来讲解下数据属性和访问器属性到底是什么? 数据属性:数据属性包含一个数据值的位置,在这个位置可以读取和写入值. 访问器属性:访问器属性不包含数据值;他们包含一对getter和setter函数在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值,在写

angularjs - 为何要双向数据绑定

最典型的场景应该属于表单 类似表单和表格之类的场景,展示与提交一般是同时存在的. 通常情况下,单向数据绑定即可解决业务需求,如数据库的内容绑定到html中展示到页面即可 但若需要设计提交功能,双向数据绑定就会发生很便捷的作用. 双向数据绑定指的是:当文本框(或其他绑定标签.控件)发生改变时,Model也会随之发生改变 这样的话.已更改的model可以立即提交无需通过繁琐的jquery获取dom和value操作 <!doctype html> <html ng-app="User

利刃 MVVMLight 3:双向数据绑定

上篇我们已经了解了MVVM的框架结构和运行原理.这里我们来看一下伟大的双向数据绑定. 说到双向绑定,大家比较熟悉的应该就是AngularJS了,几乎所有的AngularJS 系列教程的开篇几章都要涉及到,真的是很好用. 表达的效果很简单:就是在界面的操作对数据模型的修改能实时反映到数据:而数据的变更能实时展现到界面.即视图数据模型(ViewModel)和视图(View)之间的双向绑定和触发. 我们来操作一个试试看: 第一步:先写一个Model,里面包含我们需要的数据信息,代码如下: 1 ///