Explorar o código

Tree: fix setCheckedKeys bug

Dreamacro %!s(int64=8) %!d(string=hai) anos
pai
achega
cdd4aa7a8b
Modificáronse 2 ficheiros con 20 adicións e 20 borrados
  1. 2 3
      packages/tree/src/model/node.js
  2. 18 17
      packages/tree/src/model/tree-store.js

+ 2 - 3
packages/tree/src/model/node.js

@@ -5,8 +5,8 @@ export const getChildState = node => {
   let all = true;
   let none = true;
   let allWithoutDisable = true;
-
-  for (let n of node) {
+  for (let i = 0, j = node.length; i < j; i++) {
+    const n = node[i];
     if (n.checked !== true || n.indeterminate) {
       all = false;
       if (!n.disabled) {
@@ -23,7 +23,6 @@ export const getChildState = node => {
 
 const reInitChecked = function(node) {
   const {all, none, half} = getChildState(node.childNodes);
-
   if (all) {
     node.checked = true;
     node.indeterminate = false;

+ 18 - 17
packages/tree/src/model/tree-store.js

@@ -1,4 +1,4 @@
-import Node, { getChildState } from './node';
+import Node from './node';
 import { getNodeKey } from './util';
 
 export default class TreeStore {
@@ -189,35 +189,36 @@ export default class TreeStore {
 
   _setCheckedKeys(key, leafOnly = false, checkedKeys) {
     const allNodes = this._getAllNodes().sort((a, b) => b.level - a.level);
+    const cache = Object.create(null);
     const keys = Object.keys(checkedKeys);
-    for (let node of allNodes) {
-      let checked = keys.indexOf(node.data[key] + '') > -1;
+    allNodes.forEach(node => node.setChecked(false, false));
+    for (let i = 0, j = allNodes.length; i < j; i++) {
+      const node = allNodes[i];
+      const nodeKey = node.data[key].toString();
+      let checked = keys.indexOf(nodeKey) > -1;
       if (!checked) {
-        node.setChecked(false, false);
+        if (node.checked && !cache[nodeKey]) {
+          node.setChecked(false, false);
+        }
         continue;
       }
 
-      if (node.isLeaf || this.checkStrictly) {
-        node.setChecked(checked, false);
-        continue;
+      let parent = node.parent;
+      while (parent && parent.level > 0) {
+        cache[parent.data[key]] = true;
+        parent = parent.parent;
       }
 
-      const { all, none, half } = getChildState(node.childNodes);
-
-      if (all) {
-        node.setChecked(true, !this.checkStrictly);
-      } else if (half) {
-        checked = checked ? true : 'half';
-        node.setChecked(checked, !this.checkStrictly && checked === true);
-      } else if (none) {
-        node.setChecked(checked, !this.checkStrictly);
+      if (node.isLeaf || this.checkStrictly) {
+        node.setChecked(true, false);
+        continue;
       }
+      node.setChecked(true, true);
 
       if (leafOnly) {
         node.setChecked(false, false);
         const traverse = function(node) {
           const childNodes = node.childNodes;
-
           childNodes.forEach((child) => {
             if (!child.isLeaf) {
               child.setChecked(false, false);