Evan You 10 years ago
parent
commit
1feca05f3f
1 changed files with 37 additions and 8 deletions
  1. 37 8
      src/fast-repeat.js

+ 37 - 8
src/fast-repeat.js

@@ -33,20 +33,49 @@ module.exports = {
         value: data
       })
       var unlink = linker(vm, el, host, scope)
-      var f = {
-        el: el,
-        unlink: unlink
-      }
-      return f
+      return new Fragment(el, unlink)
     }
   },
 
   update: function (list) {
     if (!list) debugger
     var anchor = this.end
-    var create = this.create
-    list.forEach(function (item) {
-      _.before(create(item).el, anchor)
+    if (this.frags) {
+      this.frags.forEach(function (f) {
+        f.destroy()
+      })
+    }
+    this.frags = list.map(this.create)
+    this.frags.forEach(function (f) {
+      f.before(anchor)
     })
   }
 }
+
+function Fragment (el, unlink) {
+  this.start = _.createAnchor('fragment')
+  this.end = _.createAnchor('fragment')
+  this.frag = el
+  this.unlink = unlink
+}
+
+Fragment.prototype.before = function (target) {
+  _.before(this.start, target)
+  _.before(this.frag, target)
+  _.before(this.end, target)
+}
+
+Fragment.prototype.remove = function () {
+  var parent = this.start.parentNode
+  var node = this.start.nextSibling
+  while (node !== this.end) {
+    this.frag.appendChild(node)
+  }
+  parent.removeChild(this.start)
+  parent.removeChild(this.end)
+}
+
+Fragment.prototype.destroy = function () {
+  this.remove()
+  this.unlink()
+}