MCPcopy Index your code
hub / github.com/angular/angular / _addSelectable

Method _addSelectable

packages/compiler/src/directive_matching.ts:253–309  ·  view source on GitHub ↗

* Add an object that can be found later on by calling `match`. * @param cssSelector A css selector * @param callbackCtxt An opaque object that will be given to the callback of the `match` function

(
    cssSelector: CssSelector,
    callbackCtxt: T,
    listContext: SelectorListContext,
  )

Source from the content-addressed store, hash-verified

251 * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
252 */
253 private _addSelectable(
254 cssSelector: CssSelector,
255 callbackCtxt: T,
256 listContext: SelectorListContext,
257 ) {
258 let matcher: SelectorMatcher<T> = this;
259 const element = cssSelector.element;
260 const classNames = cssSelector.classNames;
261 const attrs = cssSelector.attrs;
262 const selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
263
264 if (element) {
265 const isTerminal = attrs.length === 0 && classNames.length === 0;
266 if (isTerminal) {
267 this._addTerminal(matcher._elementMap, element, selectable);
268 } else {
269 matcher = this._addPartial(matcher._elementPartialMap, element);
270 }
271 }
272
273 if (classNames) {
274 for (let i = 0; i < classNames.length; i++) {
275 const isTerminal = attrs.length === 0 && i === classNames.length - 1;
276 const className = classNames[i];
277 if (isTerminal) {
278 this._addTerminal(matcher._classMap, className, selectable);
279 } else {
280 matcher = this._addPartial(matcher._classPartialMap, className);
281 }
282 }
283 }
284
285 if (attrs) {
286 for (let i = 0; i < attrs.length; i += 2) {
287 const isTerminal = i === attrs.length - 2;
288 const name = attrs[i];
289 const value = attrs[i + 1];
290 if (isTerminal) {
291 const terminalMap = matcher._attrValueMap;
292 let terminalValuesMap = terminalMap.get(name);
293 if (!terminalValuesMap) {
294 terminalValuesMap = new Map<string, SelectorContext<T>[]>();
295 terminalMap.set(name, terminalValuesMap);
296 }
297 this._addTerminal(terminalValuesMap, value, selectable);
298 } else {
299 const partialMap = matcher._attrValuePartialMap;
300 let partialValuesMap = partialMap.get(name);
301 if (!partialValuesMap) {
302 partialValuesMap = new Map<string, SelectorMatcher<T>>();
303 partialMap.set(name, partialValuesMap);
304 }
305 matcher = this._addPartial(partialValuesMap, value);
306 }
307 }
308 }
309 }
310

Callers 1

addSelectablesMethod · 0.95

Calls 4

_addTerminalMethod · 0.95
_addPartialMethod · 0.95
getMethod · 0.65
setMethod · 0.65

Tested by

no test coverage detected