EmberMVC视图相关分享

  1. Ember中视图与组件的对比
  2. 创建一个不在视图树中的任意视图,如对话框
  3. 时序:didInsertElement和Em.run区别与各自应用场景


1 Ember中视图与组件的对比 
依据现有经验,结合国外社区的讨论,总结两者的对比:

从最终奥义来讲,视图能实现当前应用内的代码复用,而组件则能实现应用无关的放之任何场景都可用的代码复用

由于两者意图的不同,视图代码会更贴合当前业务需求,但不利于独立成一个日后可用的工具箱部件。而组件则会极大的与当前业务需求解耦出来,它仅提供几个有限的对外接口

视图的上下文是和当前所在路由控制器一致的,也就是共用了一套变量环境,并往往会与外部环境的控制器,消息传递发生交叉
组件的上下文则是与外部上下文独立的(当然,如有必要,组件依赖某些外部变量,还是能通过属性传入的方法来导入)。另外它也不能访问外部环境的控制器。如果需要消息交互,则应该通过一个主操作接口来向外部环境传出消息。

总体来说,很多方面,组件都力图做到内外部的解耦,充分的独立。虽然这么做能极方便的使其成为我们日后可用工具箱的一个部件,但是由于较大的脱离了业务逻辑以及上下环境的隔离,其实现往往需要更多的代码,许多时候,还需要我们处理一些细节来绕过其特性带来的约束。



2 创建一个不在视图树中的任意视图,如对话框

在Ember应用中,那些通过路由管理,容器视图管理,视图助手管理等等的视图,都是构建在一个完整视图树层级中的,并且能被chrome浏览器中的Ember Ispector拓展检测到的
然而有时候我们可能会需要创建一个不在视图树层级中的视图,某些场景下这往往能带来逻辑实现上的方便
例如一个对话框,官网教程cookbook上对于对话框的实现涉及了outlet插口,路由actions,而且这还是个未集成上效果美观的jQuery对话框插件的初步效果,咋看起来实现上还是略略麻烦,且将UI的操作放进路由里处理不太符合MVC的概念,这种界面上的响应操作我推荐写进视图的actions中
那么讲讲我推荐的做法,首先我们可以看到,一个对话框在应用中往往没有明确的节点位置、视图层级关系,那么我们可以构建一个不在视图树层次中的视图来实现它,同时我们可以手动指定一个控制器给它以提供合适的上下文环境,需要注意的是我们必须传入一个变量容器container给它(否则控制台会报出一个逆反信息)。最后,对于一个无层级的视图,我们需要通过调用视图的append方法将其追加到body节点中:

App.DialogView.create({
	controller: XXXX,
	container: this.container,
}).append();

ok, 当视图插入到body中后,也就是说dialog的主体dom内容已经ready了,接下去我们需要通过一个jQuery对话框插件将其弹出。最后,由于对话框关闭时,仅仅是通过js的方式将其css式隐藏而没有销毁对话框的视图对象,为了避免下次弹出对话框时重复,我们这里需要手动地在对话框关闭时候,将这个对话框视图销毁掉:

App.DialogView.extend = Em.View.extend({
	didInsertElement: function(){
		this._super();

		var self = this;

		this.$().dialog({
			height: 200,
			width: 500,
			draggable: true,
			resizable: false,
			modal: true,
			title: "请选择竞争车系......",
			close: function(event, ui){
				self.destroy();
			},
	}
});

ok,最后还要提醒的是,由于这个对话框是不在视图层级的,所以Ember Ispector中调试时候,我们是观察不到它的,我们需要手动的在console中输出调试信息或者加debug断点来测试它。



3 时序问题:didInsertElement和Em.run的区别与各自应用场景
Ember提供了两套逻辑来对应用生命周期的各个时间点进行管理.

1)通过生命周期钩子对一个视图view的生命周期进行管理.

包括了willInsertElement、didInsertElement、willDestroyElement、willClearRender、becameVisible、becameHidden六个视图层次的生命周期钩子.


2)通过运行时循环对应用的一个事件响应周期进行管理.

包括了sync, actions, routerTransitions, render, afterRender, destroy六个运行时队列

通常的,我们用的较多的分别是didInsertElement钩子与afterRender运行时队列。

在didInsertElement中的操作确保了当前视图及其父视图已经ready,但是不能确保其子视图的ready。
而afterRender运行时队列确保了应用当前所有的运行视图已经ready。


举例一个应用场景,如商品列表页面上有一组筛选项,它的结构是一个大容器视图包含了许多个筛选项视图,我们希望在筛选项都渲染出来后,进行一个初始化操作,将部分筛选项临时收拉起来。

首先我们就发现不能在大容器视图进入didInsertElement钩子即容器视图ready后进行初始化操作,因为此时筛选项作为其子视图还没有ready。那么最后,我们其实可以在大容器视图的didInsertElement钩子中调度一个afterRender运行时队列,这样就确保了大容器及筛选项视图的ready,并进一步的进行初始化操作:

App.FiltersContainerView = Em.View.extend({
		didInsertElement: function(){
			this._super();

			Em.run.afterRender(‘afterRender‘, this, function(){
				#初始化操作,通过调度afterRender队列来等待子筛选项视图的ready
			});
		}
	});
时间: 2024-11-25 15:36:49

EmberMVC视图相关分享的相关文章

iOS,视图相关

1.移除视图的所以子视图 2.自定义视图(UIView) 3.处理悬浮窗口(类似微信视频),等比缩放 移除视图的所以子视图 [[self.viewsubviews]makeObjectsPerformSelector:@selector(removeFromSuperview)]; 或者 NSArray *viewsToRemove = [self.view subviews]; for (UIView *v in viewsToRemove) { [v removeFromSuperview]

视图相关SQL

前面介绍了视图的概念和作用,接下来简单的用实例SQL来展现视图. 例如:首先,创建表e_information.表e_shareholder: 然后插入表数据等,在此,这简单的部分我就省略了,直接写视图SQL. 创建视图语句:CREATE VIEW + 视图名(字段1,字段2......) AS  SELECT ****  FROM **** 比如现在我想在e_information表上创建视图 V_e_TECHNOLOGY 查询各省是高新技术的企业,并且安徽省优先 视图效果展现 单表可以展示,

Oracle - 视图相关

-- 特点 -- 保护真实表, 隐藏重要字段的数据, 保护数据 -- 在视图中的操作会映射执行到真实表中 -- 可以手动开启只读模式, 使用关键字 with read only -- 视图的创建, 用户必须拥有dba权限 -- 创建视图 -- create view 视图名 as select 对外提供的内容 from 真实表名 -- 创建视图 (开启只读模式) -- create view 视图名 as select 对外提供的内容 from 真实表名 with read only -- 删除

人脸识别相关分享

人脸识别源代码 ※人脸检测(文章+程序)---技术文档及代码非常全『 人脸检测(文章+程序).rar (1.27 MB) 人脸检测(文章+程序).rar (1.27 MB) 下载次数: 12502 2010-12-21 12:26 』 ※完整的Matlab下人脸检测及识别系统源代码『 Face-Recognition-Detection.rar (393.19 KB) Face-Recognition-Detection.rar (393.19 KB) 下载次数: 11604 2010-12-2

sqlserver表、视图、索引(创建、修改、删除)相关示例

一.表相关 1.创建 USE [test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Ceshi]( [id] [int] NOT NULL, [name] [varchar(30)] NULL,  CONSTRAINT [PK_Ceshi] PRIMARY KEY CLUSTERED  ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMP

SCOM 2012知识分享-6:创建视图

适应平台:System Center 2012 RTM/SP1 ------------------------------------------------------------------------------------------------------------- System Center 2012 – Operations Manager 视图显示满足特定条件的信息.在选择视图时,会向 Operations Manager 数据库发送一个查询,查询的结果显示在结果窗格中.

android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法

        Leaning_wk每一次的进步都会拉近与成功的距离! 帐号设置退出   关闭 qq_15855289的博客 目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8月书讯      每周荐书:Java Web.Python极客编程(评论送书) android使用友盟实现第三方登录.分享以及微信回调无反应问题解决办法 标签: android友盟第三方登录分享微信登录回调问题 2017-02-10 16:2

Android开发之Navigationdrawer导航抽屉功能的实现(源代码分享)

导航抽屉(navigationdrawer)是一个从屏幕左边滑入的面板,用于显示应用的主要导航项目.用户可以通过在屏幕左边缘滑入或者触摸操作栏的应用图标打开导航抽屉.导航抽屉覆盖在内容之上,但不覆盖操作栏.当导航抽屉完全打开后,操作栏的标题需要更换为应用的名称,而不是显示当前视图的名称,并且关闭所有和当前视图相关的操作按钮.操作栏的"更多操作"菜单按钮不需要关闭,以保证用户可以随时访问"设置"和"帮助".下面我们就来实现导航抽屉的功能. Layo

ios App 动画分享

一.动画分享 1. ************* 转场动画 *************   ZFDragableModalTransition GTAppMenuController CSStickyHeaderFlowLayout PinterestAnimator URBMediaFocusViewController VCTransitionsLibrary AnimatedTransitionGallery CBHazeTransitionViewController AMWaveTran