Commit 13 - 22:处理嵌套controller

Commit 13: kinda work now except for scope nesting

  • 主要改动:将节点的each属性优先处理

  • 相关代码:

    可以看看src/seed.js的_compile函数,处理节点之前判断了是否有each属性:

    // ...
    if (eachExp) {
        // each block
        var binding = bindingParser.parse(eachAttr, eachExp)
        if (binding) {
            self._bind(node, binding)
        }
    }
    // ...
    

Commit 14:almost there! scope nesting

没有大改动。

接下来我会跳过一些琐碎的commit。

Commit 15: finally workssssss

  • 主要改动:加了一些让人神清气爽的注释

    • 比如为什么要先处理一下each(Commit 13)

      // need to set each block now so it can inherit
      // parent scope. i.e. the childSeeds must have been
      // initiated when parent scope setters are invoked
      

      因为需要继承父节点的scope

    • 为什么要复制一份data

      // keep a temporary copy for all the real data
      // so we can overwrite the passed in data object
      // with getter/setters.
      

Commit 17: emitter

  • 主要改动:添加了component/emitter

Commit 18: todo demo kinda works

  • 主要改动:增加checked指令,修改on指令

  • 代码实现

    1. checked指令

      checked: {
          bind: function () {
              var el = this.el,
                  self = this
              this.change = function () {
                  self.seed.scope[self.key] = el.checked
              }
              el.addEventListener('change', this.change)
          },
          update: function (value) {
              this.el.checked = value
          },
          unbind: function () {
              this.el.removeEventListener('change', this.change)
          }
      }
      

      可以看出这是一个控制el.checked属性的指令,可以控制元素是否选中

    2. 修改on指令

      不是很重要,略了

Commit 19: awesome

  • 主要改动:修改class指令的实现

  • 代码:

    修改后,sd-class的值可以是一个变量。

    class: function (value) {
        if (this.arg) {
            this.el.classList[value ? 'add' : 'remove'](this.arg)
        } else {
            // sd-class的值可以是一个变量
            // 比如<div id="app" sd-class="filter">
            // filter的值是一个样式
            // 比如scope.filter = 'all'
            this.el.classList.remove(this.lastVal)
            this.el.classList.add(value)
            this.lastVal = value
        }
    }
    

Commit 22: nested controllers

  • 主要改动:处理嵌套controller的情况,类似以下这种

    <div sd-controller="Grandpa">
        <p sd-text="name"></p>
        <div sd-controller="Dad">
            <p><span sd-text="name"></span>, son of <span sd-text="^name"></span></p>
            <div sd-controller="Son">
                <p><span sd-text="name"></span>, son of <span sd-text="^name"></span></p>
                <div sd-controller="Baby">
                    <p><span sd-text="name"></span>, son of <span sd-text="^name"></span>, grandson of <span sd-text="^^name"></span> and great-grandson of <span sd-text="$name"></span></p>
                </div>
            </div>
        </div>
    </div>
    
  • 代码实现:

    相关文件dev/nested.html

    1. 首先准备好四个controller

      commit22-controllers.png
    2. Seed.bootstrap()

      commit22-bootstrap().png

      当遇到sd-controller属性时,会创建一个新的实例,该实例中的parentSeed属性指向父实例。最终我们会得到如下的几个实例:

      commit22-实例.png
      因此,在页面中我们可以直接使用^来访问上一作用域。例如<span sd-text="^name"></span>,原理就是有几个^就向上访问几次parentSeed,如以下代码所示(src/seed.js

      // handle scope nesting
      if (snr && !isEachKey) { // each的情况
          scopeOwner = this.parentSeed
      } else { // 其他情况
          // ancestorKeyRE = /\^/g
          // 匹配"^"字符
          var ancestors = key.match(ancestorKeyRE),
              root      = key.match(rootKeyRE)
          // 有"^"的情况
          if (ancestors) {
              key = key.replace(ancestorKeyRE, '')
              var levels = ancestors.length
              while (scopeOwner.parentSeed && levels--) {
                  scopeOwner = scopeOwner.parentSeed
              }
          } else if (root) {
              key = key.replace(rootKeyRE, '')
              while (scopeOwner.parentSeed) {
                  scopeOwner = scopeOwner.parentSeed
              }
          }
      }
      
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335