热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

和js双向绑定实例相关的问题,vuejs双向绑定原理

本文目录一览:1、AngularJS双向绑定的选择,解决方法?

本文目录一览:


  • 1、AngularJS双向绑定的选择,解决方法?


  • 2、实现双向数据绑定


  • 3、AngularJS的数据双向绑定是怎么实现的


  • 4、js中的双向数据绑定是什么意思


  • 5、Vue.js入门教程(三)双向绑定和数据渲染


  • 6、vuejs怎样实现列表中checkbox的双向绑定及初始化渲?

AngularJS双向绑定的选择,解决方法?

AngularJS的双向绑定特性的确很好用,但是在实际使用中遇到了一些问题:

首先使用ng-repeat将数据重复展示出来(item in datas),然后在关联的modal对话框中提供修改功能(将item的对应项使用ng-model绑在modal的form上),但是由于双向绑定的原因,即便未点击保存按钮,在对话框中的修改也会实时影响到页面上的展示数据,这样有些影响体验。

相关代码

html:

div ng-repeat="item in data"

{{item.name}}

{{item.age}}

/div

a data-toggle="modal" data-target="#mySettingModal{{item.id}}" ng-click="fresh(item)"modify/a

div class="modal fade" id="mySettingModal{{item.id}}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"

div class="modal-dialog"

form name="form"

div class="form-group"

label for="name" class="control-label"名称:/label

input type="text" class="form-control" id="name" ng-model="item.name" /

/div

/form

button type="button" class="btn btn-default" data-dismiss="modal" ng-click="reset()"Close/button

button type="button" class="btn btn-primary" ng-click="updateSetting(item)"Save changes/button

/div

/div

js的写法:

$http.get("/").success(function(data) {

$scope.data = data;

var interItem;

$scope.fresh = function(item) {

interItem = item;

console.log(interItem);

};

$scope.reset = function() {

console.log(interItem);

}

});

实现双向数据绑定

MVVM框架主要包含3个部分: model 、 view 和 viewmodel 。

简单的来说,就是框架的控制器层(这里的控制器层是一个泛指,可以理解为控制view行为和联系model层的中间件)和UI展示层(view层)建立一个双向的数据通道。当这两层中的任何一方发生变化时,另一层将会自动作出相应的变化。

一般来说要实现这种双向数据绑定,在前端我目前了解的有三种形式:

目前angular,regular的实现都是基于脏检查。当发生某些特定的事情的时候,框架会调用相关的digest方法。内部逻辑就是遍历所有的 watcher ,对监控的属性做对比。如果值发生了变化,则执行相应的 handler 。

当系统进入脏检查阶段,遍历所有的 $watch 绑定的 watcher ,然后对比 watcher.get() 与 watcher.last ,如果不同则运行对应的 watcher.fn(newvalue, oldvalue) 。然后再进入下一个watcher的检查。

何时进行脏检查?

由于regularjs是基于脏检查,所以当不是由regularjs本身控制的操作(如事件、指令)引起的数据操作,可能需要你手动的去同步data与view的数据. $update方法即帮助将你的data同步到view层.

]( )元素来控制你的观察者数量。

使用ES7中的 Object.observe 方法对对象(或者其属性)进行监控观察,一旦其发生变化时,将会执行相应的handler。这是目前监控属性数据变更最完美的一种方法,语言(浏览器)原生支持,没有什么比这个更好了。唯一的遗憾就是目前支持广度还不行,有待全面推广。

vue.js和avalon.js实现数据双向绑定的原理就是属性访问器。

它使用了ES5中的定义标准属性的Object.defineProperty 方法。

Object.defineProperty 使用示例:

首先,vuejs在实例化的过程中,会对遍历传给实例化对象选项中的data 选项,遍历其所有属性并使用 Object.defineProperty 把这些属性全部转为 getter/setter。

同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染。这样就实现了所谓的双向数据绑定。

AngularJS的数据双向绑定是怎么实现的

在js的很多支持数据双向绑定的框架中,其主要实现原理为同时监听页面view和model的变量然后进行双向更新:

视图层的变化主要就是表单控件的用户输入行为造成的,比如input,select,textarea等。那么只需要监听一些事件,比如keypress,keydown,keyup,change。然后在事件回调函数中,将变化的值更新到Model中。当然同时,由于Model发生了变化,就得再次更新一下View。

而Model的变化监听方式可以有多种,主要有以下几种: 发布订阅模式(Backbone),数据劫持(VueJS,AvalonJS),数据脏检查(Angularjs,RegularJS), View抽象的脏检查(ReactJS)。

下面就来说一说Angularjs用到的数据脏检查方式的实现原理:

数据脏检查大体意思上来说,就是记录所有变量的当前值,当发生某些操作之后,通过$apply或者$digest进入脏检查环节。对比最近的一次值和现在的值是否一致,不一致则实现页面的更新,然后再执行一次直到数据不再发生变化。

详细一点就是首先angularJS将它自定义的html页面转化为正常的dom,相对来说就是要解析那些angularJS专有的指令。页面上的指令有compile和link阶段,compile的时候搜索匹配,然后执行指令定义时写的compile函数,link阶段将那些变量插入watch队列。触发脏检查时全部遍历一次watch队列,实现视图的更新。

而触发脏检查会有以下几种情况:

DOM事件,譬如用户输入文本,点击按钮(ng-click)等

XHR响应事件 ($http)

浏览器Location变更事件 ($location)

Timer事件($timeout, $interval)

执行$digest()或$apply()

最后一种情况应该是统一的入口,只不过前几种情况会自动调用这个入口而已。其他情况下,用户需要手动进入脏检查的话,就要执行$digest()或$apply()了。

js中的双向数据绑定是什么意思

双向数据绑定指的就是,绑定对象属性的改变到用户界面的变化的能力,反之亦然。换种说法,如果我们有一个user对象和一个name属性,一旦我们赋了一个新值给user.name,在UI上就会显示新的姓名了。同样地,如果UI包含了一个输入用户姓名的输入框,输入一个新值就应该会使user对象的name属性做出相应的改变。

详细的解释和例子可以看下这篇文章,,希望对你有帮助

Vue.js入门教程(三)双向绑定和数据渲染

既然清楚了原理,那么,接下来进入正题——我知道了vue怎么安装,那么我怎么使用呢?

在告诉你基础用法之前,我还是要先告诉你一个情况。

可能要令你有点失望。vue主要是侧重于数据端的。他的目的就是渲染数据和在前端调整一下数据逻辑。

他不是像jquery那样让你用来做特技的。就算你要做特技。你也应该通过css3/canvas而不是dom。

所谓的双向绑定,你可以理解就是把view。(你还不清楚mvc的话,请看第一章)

和model绑定到一起。说白了,就是你js中的绑定值变了。你dom中的内容就跟着一块变了。

vue是通过解析{{文字..}}来生成内容的。后面绑定方法,输出内容的时候都会讲到。

列表输出使用 v-for,这些v开头加横杠的叫做命令

这些命令是可以自定义的。但是那都属于高级操作,我们不用它也完全足够支撑做一个大型项目了。

其实你回发现,这里无论是v-for或者是v-什么其他玩意

它都深刻的遵循了es6的语法。这里不就是一个典型的for in 循环吗。不过我们现在都用for of了。

你记住这个用法,它就长这样。

前后端分离开发的关键在于:后台只提供接口。

我们获得的数据多数情况下,仅仅是一个json,而mvvm的关键就再于解析数据在前端完成了。如果你了解jsp或者php你会了解,数据的解析在mvc中,

是由后端完成的,而html只负责显示。

所以,当你了解了数据绑定和渲染以后,你可以第一时间先把数据输出到页面了。

我们前端最厉害的地方不就是处理能看得见的东西吗?

vuejs怎样实现列表中checkbox的双向绑定及初始化渲?

1.双向绑定可以绑定到同一个数组

input type="checkbox" value="Jack" v-model="checkedNames"

label for="jack"Jack/label

input type="checkbox" value="John" v-model="checkedNames"

label for="john"John/label

input type="checkbox" value="Mike" v-model="checkedNames"

label for="mike"Mike/label

br

spanChecked names: {{ checkedNames | json }}/span

这样可以不做任何处理,获得所有checked的checkbox。

2.可是如果需要初始化渲染,一部分checkbox被预选中,v-model需要绑定一个boolen值checked:

tr v-for="item in list"

td

input type="checkbox" :value="item.value" v-model="item.checked" /

/td

/tr

new Vue({

el: 'body',

data: {

list: [{checked:true,value:'a'},{checked:false,value:'b'}]

}

});

Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目整合。

另一方面,当与单文件组件和 Vue 生态系统支持的库结合使用时,Vue 也完全能够为复杂的单页应用程序提供驱动。


推荐阅读
  • 本文详细介绍了在 Vue.js 前端框架中集成 vue-i18n 插件以实现多语言支持的方法。通过具体的配置步骤和示例代码,帮助开发者快速掌握如何在项目中实现国际化功能,提升用户体验。同时,文章还探讨了常见的多语言切换问题及解决方案,为开发人员提供了实用的参考。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 在最近的学习过程中,我对Vue.js中的Prop属性有了更深入的理解,并认为这一知识点至关重要,因此在此记录一些心得体会。Prop属性用于在组件之间传递数据。由于每个组件实例的作用域都是独立的,无法直接引用父组件的数据。通过使用Prop,可以将数据从父组件安全地传递到子组件,确保数据的隔离性和可维护性。 ... [详细]
  • 如何撰写初级和高级前端开发者的专业简历
    如何撰写初级和高级前端开发者的专业简历 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • 基于Node.js、EJSExcel、Express与Vue.js构建Excel转JSON工具:首阶段——Vue.js项目初始化及开发环境配置
    在近期的一个H5游戏开发项目中,需要将Excel数据转换为JSON格式。经过调研,市面上缺乏合适的工具满足需求。因此,决定利用Node.js、EJSExcel、Express和Vue.js自行构建这一工具。本文主要介绍项目的第一阶段,即Vue.js项目的初始化及开发环境的配置过程,详细阐述了如何搭建高效的前端开发环境,确保后续功能开发的顺利进行。 ... [详细]
  • [c++基础]STL
    cppfig15_10.cppincludeincludeusingnamespacestd;templatevoidprintVector(constvector&integer ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 深入解析 Vue 中通过 $route.params 实现参数传递的方法与技巧
    本文深入探讨了在 Vue 框架中利用 `$route.params` 进行参数传递的方法和技巧。通过详细解析 `$route.params` 的工作机制及其与 `$route.query` 的区别,帮助开发者更好地理解和应用这一功能。文章不仅涵盖了基本的使用方法,还提供了实际案例和最佳实践,以便读者能够灵活运用这些技术,提升开发效率和代码质量。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • ### 一、指令概述指令是 Vue 中的一种特殊属性,用于增强 HTML 元素的功能。它们以 `v-` 开头,如 `v-cloak`。### 二、`v-cloak` 指令的应用`v-cloak` 指令主要用于解决页面加载过程中未编译的 Vue 插值表达式短暂显示的问题。在 Vue 实例编译完成之前,带有 `v-cloak` 的元素将被隐藏,从而避免了“闪动”现象。通过结合 CSS 样式,可以进一步优化用户体验,确保页面在初始加载时保持整洁和专业。 ... [详细]
author-avatar
布丁可爱_997
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有