摘要:
本篇主要介绍 MPVC 中的关键组件:Pagelet页面消息的包装类,里面包含更新视图的所需要的信息:Html 代码,插入位置,额外的 Json 数据参考等信息。一个 Pagelet 对应一个前端的构建块,Pagelet 的作用包括:添加、修改构建块删除构建块向构建块发送 Json 消息PageletProcessor解析 Pagelet 里面的信息,并进行处理,完成视图更新。NavigationManager处理虚拟页面切换,并管理 Url 历史。加载一个新页面,可以理解为在一个特定区域内加载一个页面级的 Pagelet,并将原来的页面实例 Dispose 掉。在查看列表类页面时,列表页面不 阅读全文
摘要:
现在设计一个系统,目标为达到以下要求:页面由若干可复用的构建块组件,构建块可以嵌套不同的页面只需要在后台将构建块按层级关系组装在一些即可,无需编写额外的代码在交互过程中,可以刷新某个或某几个构建块来达到更新视图的目的主要面临的挑战为:模块的级联更新问题在用户操作时将引发一系列的模块更新,它们如何同用户操作建立联系,即这种事件订阅关系如何生成?解决方案:对于父子关系的组件,由于构建块之间是层层嵌套的关系,底层的事件可以自然地冒泡到上层组件,但是这种事件传播又不同于 Dom 层面的事件冒泡。对于处于不同子树上的组件,则使用全局事件进行广播(好在这样的情况并不多)。兄弟节点之间的节点或有公共父节点的 阅读全文
摘要:
MPVC 是对 Model Partial-View Controller 的缩写(姑且这样称呼它)。最近看到 MVVM 模式及司徒正美的avalon 框架有一些新的想法。对于 MVVM 的不足有以下考虑:需要在所有模板都要放在前端(也许后端还需要再来一份?)建模只是为了显示需要,哪怕对于不参与逻辑处理的字段都需要进行建模,显得比较麻烦不同的页面需要不同的 VM,维护成本较高对于多页面应用仍然需要编写代码以控制程序工作逻辑最大的美妙之处在于数据模型与视图显示的自动绑定。先抛开 MVC 模式不谈,从头思考下页面的构造与工作流程:对于一个不特定的网页应用来说,页面应该由若干个不同的区块构成,不同的 阅读全文
摘要:
数据一致性:NDB由于是具有最终一致性特点的分布式数据存储,因此在数据存储时需要进行恰当的数据建模。在同一个实体集里面,所有根实体(无 parent )的实体在 id 分配上保证不重复,具有相同 parent 的实体也保证不会出现重复 ID,换句话说 id 的相对唯一性是由 parent 决定的。同时,在使用 multi_get 时也必需是取同一 parent 的实体。Ancestor 和按 id 查询时保证一致性,但是对整个实体集的查询不保证一致性,因为实体的写入分两个阶段,提交阶段和应用阶段,第一阶段中,CommitLog记录成功即认为写入成功,第二阶段更新索引,在索引更新前非Ancest 阅读全文
摘要:
1,将一张图片用CSS办法定在浏览器底部,不管怎样拖动滚动条,都保持位置。<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" 阅读全文
摘要:
8.4% of all hangs in IE9 in the past month are caused by XMLHttpRequest objects blocking the UI thread with a synchronous request.难怪 ClosureLib 不支持同步方式的调用,远程模版调用还是只有用异步的方式进行了。 阅读全文
摘要:
setup 和 tearDown 在每个测试方法的开始和结束都会被执行。对于有 dom 结构改变的场景有时候是不可逆的改变,目前只能按一定顺序执行测试方法,使 setup 逻辑只执行一次。框架代码会自动检测以 "test" 开头的测试用例,执行顺序为字母顺序,如果希望按顺序执行测试则需要对命名作一些调整。fireClickSequence 会引发完整的按钮动作过程,比如 mouseDown, click, couseUp, 而 fireClickEvent 仅引发 click 事件,引发事件是直接采用生成对象然后执行 callback 的方法,并非原生的浏览器事件。goog 阅读全文
摘要:
http://blog.html.it/layoutgala/LayoutGala09.html象这样的布局在用鼠标选取左边内容的时候很容易造成选取的面积太大,经仔细分析是因为选区跨越了 display:float 元素的边界,暂时也没有特别好的解决方案,不过可以稍微优化一下,只要选取的开始区距文字不是太远就可以。将外围的定宽 div 两边多留一些白,比如 width:1000px (>a + b + c ), 然后左边的那一列给一个 margin 就行 ,比如 总宽是 960 那么 margin = (1000 - 960) / 2 , 如果还觉得效果不够好,外面的还可以设宽些,现在最 阅读全文
摘要:
看到一个 JS 题:只允许使用 +-*/ 和 Math.* ,求一个函数 y = f(x, a, b);当 x > 100 时返回 a 的值,否则返回 b 的值,不能使用 if else 等条件语句,也不能使用 |, ?, 数组试解如下:<script>function transition(x, a, b){ x = Math.max(x, 0); // 先处理负数。 if(x == 100){ return b; } var tmp = Math.ceil(Math.min(Math.max(x - 100, 0), 1)); return a*tmp + b*Math. 阅读全文
摘要:
一个相当无聊的东西,只是告诉你 html5 canvas 如何进行基本的使用:<!DOCTYPE html><html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><titl 阅读全文
摘要:
简单总结如下:bind 直接绑定 handler 于元素上delegate 绑定事件在父级元素上live 绑定于 document 之上为啥有了 bind 还需要 delegate ?使用 deletegate 不需要为每一个元素都绑定事件处理器,并能处理动态创建的元素的 dom 事件。为啥 delegate 优于 live?它只作用于靠近目标目标元素的父级元素上,不需要冒泡到 document,在需要的时候可以停止冒泡事件;live 需要绑定于特定的 css 选择器,而 delegate 不需要,灵活性更高。为啥还要用 live?一般用于作用广泛的全站事件,比如 hovercard。 阅读全文
摘要:
使用 @synchronized() 来标明一个同步的方法。实现同步的方式与其它语言类型,使用一个互斥锁,锁定对象决定了锁定范围的大小,比如锁定实例对象只对当前实例生效,锁定类对象对所有实例生效。当同步方法中的代码抛出异常时,运行时会解锁,让下面等待代码执行此同步方法... 阅读全文
摘要:
Object-C 提供类似 Java / C++风格的错误处理模型,当使用 -fobjc-exceptions 开关(gcc > 3.3)时,它可以工作,但是只限于 OS X v10.3 以后的版本,之前的版本并不提供这一支持。使用错误捕获的原则与其它语言类似:你不能用它来当作正常的处理流的判断条件,而把它仅仅当作“意外”可以使用多个 @catch 块来捕获不同的错误类型。Cup *cup = [[Cup alloc] init];@try { [cup fill];}@catch (NSException *exception) { NSLog(@"main: Caught 阅读全文
摘要:
在 object-c 中,selector 包含两种意义:在源文件中,它指向一个方法调用,在编译后它指向一个 unque indentifier。编译后的 selector 的类型为 SEL,同名的方法的选择器也相同。使用 selector 来调用object 方法是 Cocoa 框架 "目标-动作" 编程模型的基础。可以使用 @selector 来为 selector 创建一个别名:SEL setWidthHeight;setWidthHeight = @selector(setWidth:height:);在编译时用别名方法引用 seletor 不会对性能造成大的影响。 阅读全文
摘要:
默认的动态行为:对象是动态类型推断的只有在运行时才分配内存消息是动态绑定的,对象只能执行它所理解的消息”方法调用“虽然动态执行让程序变得灵活,但是也少了编译时的类型检查,你可以使用静态类型来进行编译时检查。Rectangle *thisObject = [[Square alloc] init];象这样指定类型,基本上只影响到编译时的检查,其它的行为跟 typed as id 是一样的。好处;1。 静态类型检查2。显式的方法参数类型与返回值。3。允许你使用 structure pointer 直接访问对象的实例变量。使用静态类型后,如果一个对象没有响应一个它应该响应的消息,那么会报错把一个静态 阅读全文
摘要:
快速枚举使用的语法:for ( TypenewVariable in expression ) { statements }orTypeexistingItem;for ( existingItem in expression ) { statements }枚举期间对象不能被改变。使用快速枚举的三个类:NSArray, NSDictionary, NSSet如何使用:NSArray *array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", @"Four&qu 阅读全文
摘要:
上一章讲了对类的方法进行扩展, 相关引用就是为现存的 class 增加另外的实例可引用变量(通常是一个静态变量),这个功能只在 iOS and OS X v10.6 以后提供。引入这种机制的原因类同于类的方法扩展。static char overviewKey;NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];// For the purposes of illustration, use initWithFormat: t 阅读全文
摘要:
category 下称类别允许你甚至在没有类源码的情况下扩展一个类的功能,给它增加方法。** 这个可以理解为 "mixin" 的一种机制。主要作用是使相同的方法在没有继承关的类中复用。要使用它需要在类的@interface 文件中的category 处指名方法的名并在对应的实现文件中编写代码。但是不能使用 category 为类添加新的实例变量。category 只是一种编译时手段,定义在里面的方法与类的实例方法在运行时没有任何的不同。#import "ClassName.h"@interface ClassName ( CategoryName )// 阅读全文
摘要:
本节讨论了如何使用申明属性与系统内部实际使用了自动生成的方法用作属性访问的接口,由此引入的实例变量管理等等问题。使用申明属性 declared properties 可以方便地实现访问器方法 accessor methods.申明属性为访问器方法行为提供一种清晰,明确的规范。编译器帮你将申请属性扩展为访问器方法实现以短减你书写的代码量。申明属性也是一类标识符并且有自己的作用域,因此编译器可以探测到未申明的属性。语法:@property(attributes) type name;例如:@interface MyClass : NSObject{ float value;}@property f 阅读全文
摘要:
**以下内容中 interface 指代传统意义上的接口, 而@interface 指代 Objective-C 中的类型规范概念,以免混乱。看到这一章,有点奇怪,其实只要将 protocal 当作 C# 里面的接口来认识就好了。因为 Objective-C 给每个 Class 都分配了一个 @interface ,因此用这人概念来表达 interface 的意思。抽象出接口的目的:1. 相似方法组的实现有共同的规范。2. 让“接口”独立于类。3. 封装没有继承关系的类的共性。if ( [assistant respondsToSelector:@selector(helpOut:)] ) { 阅读全文