OSDN Git Service

fix: cache
[pettanr/pettanr.git] / app / assets / javascripts / peta / element_nestable_content.js.coffee
index ef01b55..a5e658d 100644 (file)
@@ -13,21 +13,27 @@ class Peta.ElementNestableContent extends Peta.Content
     _.each @elements_items(), (item) =>\r
       item.boosts(level) if item\r
   \r
-  replaced_attributes: () ->\r
+  replaced_attributes: (options = {}) ->\r
     attributes = {}\r
     _.each @attributes, (attribute, name) =>\r
       replaced = if _.isArray(attribute)\r
         # has many association\r
         model = @my_class().my_manifest().associations.has_many[name].model()\r
         _.map attribute, (attr) =>\r
-          child = @replace_element(model, attr)\r
-          child.attributes = child.replaced_attributes()\r
+          child = if options.hold\r
+            @replace_and_hold_element(model, attr)\r
+          else\r
+            @replace_element(model, attr)\r
+          child.attributes = child.replaced_attributes(options)\r
           child\r
       else if _.isObject(attribute)\r
         # has one association\r
         model = @my_class().my_manifest().associations.has_one[name].model()\r
-        child = @replace_element(model, attribute)\r
-        child.attributes = child.replaced_attributes()\r
+        child = if options.hold\r
+          @replace_and_hold_element(model, attribute)\r
+        else\r
+          @replace_element(model, attribute)\r
+        child.attributes = child.replaced_attributes(options)\r
         child\r
       else\r
         attribute\r
@@ -40,3 +46,47 @@ class Peta.ElementNestableContent extends Peta.Content
     Pettanr.cache.store(empty_child) if !cached_child\r
     cached_child || empty_child\r
   \r
+  replace_and_hold_element: (model, attr) ->\r
+    empty_child = new model(attr)\r
+    cached_child = Pettanr.cache.restore(empty_child)\r
+    item = if cached_child\r
+      cached_child\r
+    else\r
+      Pettanr.cache.store(empty_child) \r
+    holden = item.hold()\r
+    holden.attributes = attr\r
+    holden\r
+  \r
+  hold: () ->\r
+    super()\r
+  \r
+  fix: () ->\r
+    super()\r
+    @fix_elements()\r
+  \r
+  release: () ->\r
+    super()\r
+    @release_elements()\r
+  \r
+  release_elements: () ->\r
+    _.each @attributes, (elements, name) =>\r
+      if _.isArray(elements)\r
+        # has many association\r
+        model = @my_class().my_manifest().associations.has_many[name].model()\r
+        _.each elements, (element) =>\r
+          element.release()\r
+      else if _.isObject(elements)\r
+        # has one association\r
+        elements.release()\r
+  \r
+  fix_elements: () ->\r
+    _.each @attributes, (elements, name) =>\r
+      if _.isArray(elements)\r
+        # has many association\r
+        model = @my_class().my_manifest().associations.has_many[name].model()\r
+        _.each elements, (element) =>\r
+          element.fix()\r
+      else if _.isObject(elements)\r
+        # has one association\r
+        elements.fix()\r
+  \r