diff --git a/build/underscore-ko.js b/build/underscore-ko.js index d81dd23..2aeb270 100644 --- a/build/underscore-ko.js +++ b/build/underscore-ko.js @@ -1,4 +1,4 @@ -// underscore-ko - v1.8.0 - 2016-03-13 +// underscore-ko - v1.8.1 - 2016-03-13 // https://github.com/kamranayub/UnderscoreKO // Copyright (c) 2016 Kamran Ayub ; Licensed MIT */ (function (factory) { @@ -66,6 +66,31 @@ "intersection", "intersection_", "zip", "zip_" ]; + // replaces _.property with support for KO observable values + _.property = function (key) { + return function (obj) { + return obj == null ? void 0 : ko.utils.unwrapObservable(obj)[key]; + }; + }; + // replaces _.propertyOf with support for KO observable values + _.propertyOf = function (obj) { + return obj == null ? function () { } : function (key) { + return ko.utils.unwrapObservable(obj)[key]; + }; + }; + // replaces _.isMatch with support for KO observable values + _.isMatch = function (object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) + return !length; + var obj = Object(ko.utils.unwrapObservable(object)); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) + return false; + } + return true; + }; _.each(_.union(methods, arrayMethods), function (fn) { // Let's be good and safe Javascript citizens! if (!ko.observableArray.fn[fn]) { diff --git a/build/underscore-ko.js.map b/build/underscore-ko.js.map index 11a7c06..ec4776f 100644 --- a/build/underscore-ko.js.map +++ b/build/underscore-ko.js.map @@ -1 +1 @@ -{"version":3,"file":"underscore-ko.js","sourceRoot":"","sources":["../src/underscore-ko.ts","../src/interface.ts"],"names":[],"mappings":"AAAA,CAAC,UAAU,OAAO;IAChB,IAAI,MAAM,GAAG,MAAM,CAAC;IACpB,EAAE,CAAC,CAAC,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClD,uBAAuB;QACvB,MAAM,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC;AACH,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS;IAE1B,uEAAuE;IACvE,IAAI,OAAO,GAAG;QACZ,cAAc;QACd,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,QAAQ,EAAE,OAAO;QAC3B,aAAa,EAAE,OAAO;QACtB,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;QACxC,OAAO;QACP,WAAW;QACX,QAAQ,EAAE,SAAS;QACnB,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,SAAS;QACnB,OAAO;QACP,KAAK;QACL,KAAK;QACL,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,UAAU;QACrB,SAAS;QACT,SAAS;QACT,SAAS,EAAE,UAAU;QACrB,QAAQ;QACR,MAAM;QACN,WAAW;QAEX,SAAS;QACT,OAAO,EAAE,MAAM,EAAE,MAAM;QACvB,SAAS;QACT,MAAM;QACN,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;QACjD,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,UAAU;QACrB,SAAS,EAAE,UAAU;QACrB,OAAO,EAAC,QAAQ;QAChB,cAAc,EAAE,eAAe;QAC/B,YAAY,EAAE,aAAa;QAC3B,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS;QACpC,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,QAAQ;QACjB,QAAQ;QACR,aAAa;QACb,aAAa;QACb,WAAW;QACX,eAAe;QAEf,OAAO;QACP,OAAO;KACR;IAED,0CAA0C;IAC1C,YAAY,GAAG;QACb,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,eAAe;QAC/B,KAAK,EAAE,MAAM;KACd,CAAC;IAEF,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,UAAU,EAAE;QACjD,8CAA8C;QAC9C,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/B,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG;gBAC1B,IAAI,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBAEhC,wBAAwB;gBACxB,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC9B,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,CAAC;wBACzB,8CAA8C;wBAC9C,+CAA+C;wBAC/C,qCAAqC;wBACrC,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,UAAU,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;4BACvC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;wBACpB,CAAC;oBACL,CAAC,CAAC,CAAC;gBACP,CAAC;gBAED,8BAA8B;gBAC9B,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE1B,kBAAkB;gBAClB,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBACtC,gEAAgE;oBAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBAClE,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,iCAAiC;oBACjC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnC,CAAC;YACH,CAAC,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"underscore-ko.js","sourceRoot":"","sources":["../src/underscore-ko.ts","../src/interface.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/underscore-ko.min.js b/build/underscore-ko.min.js index 62655c7..da7a17c 100644 --- a/build/underscore-ko.min.js +++ b/build/underscore-ko.min.js @@ -1,4 +1,4 @@ -// underscore-ko - v1.8.0 - 2016-03-13 +// underscore-ko - v1.8.1 - 2016-03-13 // https://github.com/kamranayub/UnderscoreKO // Copyright (c) 2016 Kamran Ayub ; Licensed MIT */ -!function(e){var define=define;"function"==typeof define&&define.amd?define(["knockout","underscore"],e):e(window.ko,window._)}(function(e,n){var t=["each","forEach","map","collect","reduce","inject","foldl","reduceRight","foldr","find","detect","filter","select","filter_","select_","where","findWhere","reject","reject_","all","every","any","some","include","contains","invoke","invoke_","pluck","max","min","sortBy","sortBy_","groupBy","groupBy_","indexBy","countBy","shuffle","shuffle_","sample","size","partition","first","head","take","initial","last","rest","tail","drop","rest_","tail_","drop_","compact","compact_","flatten","flatten_","without","without_","union","union_","intersection","intersection_","difference","difference_","uniq","unique","uniq_","unique_","zip","zip_","unzip","unzip_","object","lastIndexOf","sortedIndex","findIndex","findLastIndex","chain"],i=["union","union_","intersection","intersection_","zip","zip_"];n.each(n.union(t,i),function(t){e.observableArray.fn[t]||(e.observableArray.fn[t]=function(){var e=n.toArray(arguments);return n.include(i,t)&&n.each(e,function(n,i){"function"==typeof n&&n[t]&&(e[i]=n())}),e.splice(0,0,this()),"_"===t.substr(t.length-1,1)?this(n[t.substr(0,t.length-1)].apply(this,e)):n[t].apply(this,e)})})}); \ No newline at end of file +!function(n){var define=define;"function"==typeof define&&define.amd?define(["knockout","underscore"],n):n(window.ko,window._)}(function(n,e){var t=["each","forEach","map","collect","reduce","inject","foldl","reduceRight","foldr","find","detect","filter","select","filter_","select_","where","findWhere","reject","reject_","all","every","any","some","include","contains","invoke","invoke_","pluck","max","min","sortBy","sortBy_","groupBy","groupBy_","indexBy","countBy","shuffle","shuffle_","sample","size","partition","first","head","take","initial","last","rest","tail","drop","rest_","tail_","drop_","compact","compact_","flatten","flatten_","without","without_","union","union_","intersection","intersection_","difference","difference_","uniq","unique","uniq_","unique_","zip","zip_","unzip","unzip_","object","lastIndexOf","sortedIndex","findIndex","findLastIndex","chain"],i=["union","union_","intersection","intersection_","zip","zip_"];e.property=function(e){return function(t){return null==t?void 0:n.utils.unwrapObservable(t)[e]}},e.propertyOf=function(e){return null==e?function(){}:function(t){return n.utils.unwrapObservable(e)[t]}},e.isMatch=function(t,i){var r=e.keys(i),u=r.length;if(null==t)return!u;for(var o=Object(n.utils.unwrapObservable(t)),c=0;u>c;c++){var a=r[c];if(i[a]!==o[a]||!(a in o))return!1}return!0},e.each(e.union(t,i),function(t){n.observableArray.fn[t]||(n.observableArray.fn[t]=function(){var n=e.toArray(arguments);return e.include(i,t)&&e.each(n,function(e,i){"function"==typeof e&&e[t]&&(n[i]=e())}),n.splice(0,0,this()),"_"===t.substr(t.length-1,1)?this(e[t.substr(0,t.length-1)].apply(this,n)):e[t].apply(this,n)})})}); \ No newline at end of file diff --git a/package.json b/package.json index e1fa2b6..594e325 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "underscore-ko", "description": "Dead simple utility that attaches Underscore.js array and collection functions (and mutators) to Knockout.js observable arrays.", - "version": "1.8.0", + "version": "1.8.1", "author": "Kamran Ayub ", "homepage": "https://github.com/kamranayub/UnderscoreKO", "repository": { diff --git a/spec/spec.js b/spec/spec.js index 3a647e3..7e8d893 100644 --- a/spec/spec.js +++ b/spec/spec.js @@ -151,9 +151,25 @@ describe("UnderscoreKO", function () { expect(vm.objs.where({b:1})).toEqual([vm.objs()[0],vm.objs()[2]]); }); + it("supports where with observable values", function () { + var obsa = ko.observable({ b: 1 }), + obsb = ko.observable({ b: 0 }), + arr = ko.observableArray([obsa, obsb]); + + expect(arr.where({b:1})).toEqual([obsa]); + }); + it("supports findWhere", function () { expect(vm.objs.findWhere({b:1})).toEqual(vm.objs()[0]); }); + + it("supports findWhere with observable values", function () { + var obsa = ko.observable({ b: 1 }), + obsb = ko.observable({ b: 0 }), + arr = ko.observableArray([obsa, obsb]); + + expect(arr.findWhere({b:1})).toEqual(obsa); + }); it("supports invoke", function () { expect(vm.arr.invoke("toString")).toEqual(["0", "1", "2", "3", "4"]); diff --git a/src/underscore-ko.ts b/src/underscore-ko.ts index a391505..c7e4b08 100644 --- a/src/underscore-ko.ts +++ b/src/underscore-ko.ts @@ -66,6 +66,32 @@ "intersection", "intersection_", "zip", "zip_" ]; + + // replaces _.property with support for KO observable values + _.property = function(key) { + return function(obj) { + return obj == null ? void 0 : ko.utils.unwrapObservable(obj)[key]; + }; + }; + + // replaces _.propertyOf with support for KO observable values + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return ko.utils.unwrapObservable(obj)[key]; + }; + }; + + // replaces _.isMatch with support for KO observable values + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(ko.utils.unwrapObservable(object)); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; _.each(_.union(methods, arrayMethods), function (fn) { // Let's be good and safe Javascript citizens!