diff --git a/js/directives/fileselect.js b/js/directives/fileselect.js index 235fddb..08904c3 100644 --- a/js/directives/fileselect.js +++ b/js/directives/fileselect.js @@ -34,7 +34,7 @@ app.directive("indeterminate", [ } }; }; - var passIfNotIsLeafChild = function (callback) { // ensure to execute callback only when this input hasn't subinput + var passIfNotIsLeafChild = function (callback) { // ensure to execute callback only when this input hasn't any subinput return function () { if (children.length === 0) { callback.apply(this, arguments); @@ -48,44 +48,45 @@ app.directive("indeterminate", [ } }; }; - var passIfIsIndeterminate = function (callback) { // pass through the event from the scope where they sent + var passIfIsIndeterminate = function (callback) { // pass through the event when this input is indeterminate return function () { if (!elem.prop("indeterminate")) { return callback.apply(this, arguments); } }; }; - var catchEventOnlyOnce = function (callback) { // only fire once, and stop event's propagation - return function (event) { - callback.apply(this, arguments); - return event.stopPropagation(); - }; - }; + /* var catchEventOnlyOnce = function (callback) { // only fire once, and stop event's propagation + return function (event) { + callback.apply(this, arguments); + return event.stopPropagation(); + }; + }; */ if (attr["indeterminate"] && parse(attr["indeterminate"]).constant) { setIndeterminateState(scope.$eval(attr["indeterminate"])); // set to default value (set in template) } if (attr["indeterminate"] && parse(attr["indeterminate"]).constant && !scope.$eval(attr["indeterminate"])) { // when this input wont have subinput, they will only receive parent change and emit child change event ngModelCtrl.$viewChangeListeners.push(passIfNotIsLeafChild(function () { - scope.$emit("childSelectedChange", get()); + scope.$emit("childSelectedChange", get()); // notifies parents to change their state })); scope.$on("ParentSelectedChange", passThroughThisScope(passIfNotIsLeafChild( function (event, newVal) { setModelValueWithSideEffect(newVal); // set value to parent's value; this will cause listener to emit childChange event; this won't be a infinite loop }))); // init first time and only once - scope.$emit("i'm child input", get); + scope.$emit("i'm child input", get); // traverses upwards toward the root scope notifying the listeners for keep reference to this input's value scope.$emit("childSelectedChange", get()); // force emitted, and force the parent change their state base on children at first time } else { // establish parent-child's relation // listen for the child emitted token - scope.$on("i'm child input", passThroughThisScope( + scope.$on("i'm child input", passThroughThisScope( // can't apply pass passIfIsLeafChild, at beginning all has not child input function (event, child) { children.push(child); }) ); var updateBaseOnChildrenState = function (event, newChildValue) { if ((cacheSelectedSubInputNumber + cacheNoSelectedSubInputNumber) !== children.length) { + // cache childern state cacheSelectedSubInputNumber = 0; cacheNoSelectedSubInputNumber = 0; for (var i = 0; i < children.length; i++) { @@ -106,7 +107,7 @@ app.directive("indeterminate", [ cacheNoSelectedSubInputNumber++; } } - var allSelected = (cacheNoSelectedSubInputNumber === 0); + var allSelected = (cacheNoSelectedSubInputNumber === 0); // if doesn't has any no selected input var anySeleted = (cacheSelectedSubInputNumber > 0); setIndeterminateState(allSelected !== anySeleted); // if at least one is selected, but not all then set input property indeterminate to true setModelValueWithSideEffect(allSelected); // change binding model value and trigger onchange event