|
97 | 97 | .provider('DS', function () { |
98 | 98 |
|
99 | 99 | var _this = this; |
| 100 | + var DSUtils = JSData.DSUtils; |
| 101 | + var DSErrors = JSData.DSErrors; |
100 | 102 | var deps = []; |
101 | 103 |
|
102 | 104 | for (var i = 0; i < adapters.length; i++) { |
|
107 | 109 |
|
108 | 110 | _this.defaults = {}; |
109 | 111 |
|
| 112 | + JSData.DS.prototype.bindAll = function (scope, expr, resourceName, params, cb) { |
| 113 | + var _this = this; |
| 114 | + |
| 115 | + params = params || {}; |
| 116 | + |
| 117 | + if (!DSUtils.isObject(scope)) { |
| 118 | + throw new DSErrors.IA('"scope" must be an object!'); |
| 119 | + } else if (!DSUtils.isString(expr)) { |
| 120 | + throw new DSErrors.IA('"expr" must be a string!'); |
| 121 | + } else if (!_this.definitions[resourceName]) { |
| 122 | + throw new DSErrors.NER(resourceName); |
| 123 | + } else if (!DSUtils.isObject(params)) { |
| 124 | + throw new DSErrors.IA('"params" must be an object!'); |
| 125 | + } |
| 126 | + |
| 127 | + try { |
| 128 | + return scope.$watch(function () { |
| 129 | + return _this.lastModified(resourceName); |
| 130 | + }, function () { |
| 131 | + var items = _this.filter(resourceName, params); |
| 132 | + DSUtils.set(scope, expr, items); |
| 133 | + if (cb) { |
| 134 | + cb(null, items); |
| 135 | + } |
| 136 | + }); |
| 137 | + } catch (err) { |
| 138 | + if (cb) { |
| 139 | + cb(err); |
| 140 | + } else { |
| 141 | + throw err; |
| 142 | + } |
| 143 | + } |
| 144 | + }; |
| 145 | + |
| 146 | + JSData.DS.prototype.bindAll = function (scope, expr, resourceName, id, cb) { |
| 147 | + var _this = this; |
| 148 | + |
| 149 | + id = DSUtils.resolveId(_this.definitions[resourceName], id); |
| 150 | + if (!DSUtils.isObject(scope)) { |
| 151 | + throw new DSErrors.IA('"scope" must be an object!'); |
| 152 | + } else if (!DSUtils.isString(expr)) { |
| 153 | + throw new DSErrors.IA('"expr" must be a string!'); |
| 154 | + } else if (!DS.definitions[resourceName]) { |
| 155 | + throw new DSErrors.NER(resourceName); |
| 156 | + } else if (!DSUtils.isString(id) && !DSUtils.isNumber(id)) { |
| 157 | + throw new DSErrors.IA('"id" must be a string or a number!'); |
| 158 | + } |
| 159 | + |
| 160 | + try { |
| 161 | + return scope.$watch(function () { |
| 162 | + return _this.lastModified(resourceName, id); |
| 163 | + }, function () { |
| 164 | + var item = _this.get(resourceName, id); |
| 165 | + DSUtils.set(scope, expr, item); |
| 166 | + if (cb) { |
| 167 | + cb(null, item); |
| 168 | + } |
| 169 | + }); |
| 170 | + } catch (err) { |
| 171 | + if (cb) { |
| 172 | + cb(err); |
| 173 | + } else { |
| 174 | + throw err; |
| 175 | + } |
| 176 | + } |
| 177 | + }; |
| 178 | + |
110 | 179 | function load() { |
111 | 180 | var args = Array.prototype.slice.call(arguments); |
112 | 181 | var $rootScope = args[args.length - 1]; |
113 | 182 | var store = new JSData.DS(_this.defaults); |
114 | 183 | var originals = {}; |
115 | 184 |
|
| 185 | + // Register any adapters that have been loaded |
116 | 186 | for (var i = 0; i < adapters.length; i++) { |
117 | 187 | if (adapters[i].loaded) { |
118 | 188 | store.registerAdapter(adapters[i].name, arguments[i]); |
119 | 189 | } |
120 | 190 | } |
121 | 191 |
|
| 192 | + // Wrap certain sync functions with $apply |
122 | 193 | for (i = 0; i < functionsToWrap.length; i++) { |
123 | 194 | originals[functionsToWrap[i]] = store[functionsToWrap[i]]; |
124 | 195 | store[functionsToWrap[i]] = (function (name) { |
|
134 | 205 | })(functionsToWrap[i]); |
135 | 206 | } |
136 | 207 |
|
| 208 | + // Hook into the digest loop (throttled) |
| 209 | + if (typeof Object.observe !== 'function' || |
| 210 | + typeof Array.observe !== 'function') { |
| 211 | + $rootScope.$watch(function () { |
| 212 | + // Throttle angular-data's digest loop to tenths of a second |
| 213 | + return new Date().getTime() / 100 | 0; |
| 214 | + }, function () { |
| 215 | + store.digest(); |
| 216 | + }); |
| 217 | + } |
| 218 | + |
137 | 219 | return store; |
138 | 220 | } |
139 | 221 |
|
|
0 commit comments