对设计模式的理解

来源:互联网 发布:C语言下列叙述错误的是 编辑:程序博客网 时间:2024/05/18 01:51

MVVM

  1. mvvm由model -> view, model <- view的原型演化而来(也就是说交互存在两个方向:v -> m, v <- m),在二者之间加入vm解耦。
  2. v收到用户指令要改动m,不能直接访问m,必须使用vm提供的方法间接访问m,所以v的结点可能需要提供到m中映射数据的索引或引用。
  3. vm应监控m中的数据,一旦数据有变,vm通知数据对应的v节点,所以,vm中应有v节点和对应数据的binding。
  4. 那么v和m中的数据和ui组件如何绑定呢?可将数据结构处理为类似哈希表的形式:生成共同的id,在v和m中对应的对象可使用id提取。

knockout

  1. 可能使用了观察者模式,在ko.observable中埋伏了.fire(),每当调用observable对数据进行更改时,fire()会通知viewmodel,以这种方法监控对数据的调用。以下是我理解的实现方式:
function observable(value){    return function(replaceVal){        if(replaceVal){            ko.fire() //通知viewModel有改动            value = replaceVal;        }else{            return value;        }    }} 
  1. 用data-bind绑定view和model。考虑到表现和行为的分层,data-bind最好在js中的init函数中写入。
  2. 在octopus模式中,对data的取用往往需要在octopus对象上增添一个相应的method,这很笨拙且浪费资源。ko用obsevable返回的函数来代理data变量,解决了这个问题。
  3. data-bind=”text: xx”可以理解为text(context.xx),text是ko的method{把context.xx写入节点的text},冒号后面的是参数。
  4. data-bind也可以绑定各种表达式(函数,三元操作之类的).
  5. data-bind=”click: foo”,回调函数foo调用的方式是context.foo()
  6. ko.applyBindings(obj)会绑定obj为binding context root,foreach:和with:会使部分节点范围内的binding context变小
  7. 若要访问binding context范围外的数据,可使用binding context提供的变量$parent 、$data、$root等等
  8. ko的事件会将触发事件的节点上的binding-context对象作为this参数传给handler
  9. this.a = ko.obsevable(1); this.a = ko.obsevable(1); this.sum = ko.computed(function)(){ return this.a() + this.b() }, this) ko.computed的原理:当你修改a时,必然是a(newValue),调用a会触发computed中的匿名回调函数从而更新sum的值;computed的监控在a、b是对象的时候对a、b的属性无效,因为此时a、b是指针,当它们的属性变化(比如增加一个属性)时,a、b指向的内存地址并没有变,而且,修改a的属性只需要a().attr = newValue,没有给a传递val,ko将操作识别为读取而不是写。
原创粉丝点击