@lxlib/seed
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 9.1.1.
1,150 lines • 75.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: reuse-tab.service.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __read, __spread } from "tslib";
import { Injectable, Injector } from '@angular/core';
import { ActivatedRoute, NavigationEnd, NavigationStart, Router, ROUTER_CONFIGURATION, } from '@angular/router';
import { MenuService, ScrollService } from '@lxlib/theme';
import { BehaviorSubject } from 'rxjs';
import { ReuseTabMatchMode } from './reuse-tab.interfaces';
import * as i0 from "@angular/core";
import * as i1 from "@lxlib/theme";
/**
* 路由复用类,提供复用所需要一些基本接口
*
* **注:** 所有缓存数据来源于路由离开后才会产生
*/
var ReuseTabService = /** @class */ (function () {
// #endregion
function ReuseTabService(injector, menuService) {
this.injector = injector;
this.menuService = menuService;
this._inited = false;
this._max = 10;
this._keepingScroll = false;
this._cachedChange = new BehaviorSubject(null);
this._cached = [];
this._titleCached = {};
this._closableCached = {};
this.positionBuffer = {};
this.debug = false;
this.mode = ReuseTabMatchMode.Menu;
/**
* 排除规则,限 `mode=URL`
*/
this.excludes = [];
}
Object.defineProperty(ReuseTabService.prototype, "snapshot", {
get: /**
* @private
* @return {?}
*/
function () {
return this.injector.get(ActivatedRoute).snapshot;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "inited", {
// #region public
get:
// #region public
/**
* @return {?}
*/
function () {
return this._inited;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "curUrl", {
/** 当前路由地址 */
get: /**
* 当前路由地址
* @return {?}
*/
function () {
return this.getUrl(this.snapshot);
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "max", {
/** 允许最多复用多少个页面,取值范围 `2-100`,值发生变更时会强制关闭且忽略可关闭条件 */
set: /**
* 允许最多复用多少个页面,取值范围 `2-100`,值发生变更时会强制关闭且忽略可关闭条件
* @param {?} value
* @return {?}
*/
function (value) {
this._max = Math.min(Math.max(value, 2), 100);
for (var i = this._cached.length; i > this._max; i--) {
this._cached.pop();
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "keepingScroll", {
get: /**
* @return {?}
*/
function () {
return this._keepingScroll;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._keepingScroll = value;
this.initScroll();
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "items", {
/** 获取已缓存的路由 */
get: /**
* 获取已缓存的路由
* @return {?}
*/
function () {
return this._cached;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "count", {
/** 获取当前缓存的路由总数 */
get: /**
* 获取当前缓存的路由总数
* @return {?}
*/
function () {
return this._cached.length;
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "change", {
/** 订阅缓存变更通知 */
get: /**
* 订阅缓存变更通知
* @return {?}
*/
function () {
return this._cachedChange.asObservable(); // .pipe(filter(w => w !== null));
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "title", {
/** 自定义当前标题 */
set: /**
* 自定义当前标题
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var url = this.curUrl;
if (typeof value === 'string')
value = { text: value };
this._titleCached[url] = value;
this.di('update current tag title: ', value);
this._cachedChange.next({
active: 'title',
title: value,
list: this._cached,
});
},
enumerable: true,
configurable: true
});
/** 获取指定路径缓存所在位置,`-1` 表示无缓存 */
/**
* 获取指定路径缓存所在位置,`-1` 表示无缓存
* @param {?} url
* @return {?}
*/
ReuseTabService.prototype.index = /**
* 获取指定路径缓存所在位置,`-1` 表示无缓存
* @param {?} url
* @return {?}
*/
function (url) {
return this._cached.findIndex((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.url === url; }));
};
/** 获取指定路径缓存是否存在 */
/**
* 获取指定路径缓存是否存在
* @param {?} url
* @return {?}
*/
ReuseTabService.prototype.exists = /**
* 获取指定路径缓存是否存在
* @param {?} url
* @return {?}
*/
function (url) {
return this.index(url) !== -1;
};
/** 获取指定路径缓存 */
/**
* 获取指定路径缓存
* @param {?=} url
* @return {?}
*/
ReuseTabService.prototype.get = /**
* 获取指定路径缓存
* @param {?=} url
* @return {?}
*/
function (url) {
return url ? this._cached.find((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.url === url; })) || null : null;
};
/**
* @private
* @param {?} url
* @param {?} includeNonCloseable
* @return {?}
*/
ReuseTabService.prototype.remove = /**
* @private
* @param {?} url
* @param {?} includeNonCloseable
* @return {?}
*/
function (url, includeNonCloseable) {
/** @type {?} */
var idx = typeof url === 'string' ? this.index(url) : url;
/** @type {?} */
var item = idx !== -1 ? this._cached[idx] : null;
if (!item || (!includeNonCloseable && !item.closable))
return false;
this.destroy(item._handle);
this._cached.splice(idx, 1);
delete this._titleCached[url];
return true;
};
/**
* 根据URL移除标签
*
* @param [includeNonCloseable=false] 是否强制包含不可关闭
*/
/**
* 根据URL移除标签
*
* @param {?} url
* @param {?=} includeNonCloseable
* @return {?}
*/
ReuseTabService.prototype.close = /**
* 根据URL移除标签
*
* @param {?} url
* @param {?=} includeNonCloseable
* @return {?}
*/
function (url, includeNonCloseable) {
if (includeNonCloseable === void 0) { includeNonCloseable = false; }
this.removeUrlBuffer = url;
this.remove(url, includeNonCloseable);
this._cachedChange.next({ active: 'close', url: url, list: this._cached });
this.di('close tag', url);
return true;
};
/**
* 清除右边
*
* @param [includeNonCloseable=false] 是否强制包含不可关闭
*/
/**
* 清除右边
*
* @param {?} url
* @param {?=} includeNonCloseable
* @return {?}
*/
ReuseTabService.prototype.closeRight = /**
* 清除右边
*
* @param {?} url
* @param {?=} includeNonCloseable
* @return {?}
*/
function (url, includeNonCloseable) {
if (includeNonCloseable === void 0) { includeNonCloseable = false; }
/** @type {?} */
var start = this.index(url);
for (var i = this.count - 1; i > start; i--) {
this.remove(i, includeNonCloseable);
}
this.removeUrlBuffer = null;
this._cachedChange.next({ active: 'closeRight', url: url, list: this._cached });
this.di('close right tages', url);
return true;
};
/**
* 清除所有缓存
*
* @param [includeNonCloseable=false] 是否强制包含不可关闭
*/
/**
* 清除所有缓存
*
* @param {?=} includeNonCloseable
* @return {?}
*/
ReuseTabService.prototype.clear = /**
* 清除所有缓存
*
* @param {?=} includeNonCloseable
* @return {?}
*/
function (includeNonCloseable) {
var _this = this;
if (includeNonCloseable === void 0) { includeNonCloseable = false; }
this._cached.forEach((/**
* @param {?} w
* @return {?}
*/
function (w) {
if (!includeNonCloseable && w.closable)
_this.destroy(w._handle);
}));
this._cached = this._cached.filter((/**
* @param {?} w
* @return {?}
*/
function (w) { return !includeNonCloseable && !w.closable; }));
this.removeUrlBuffer = null;
this._cachedChange.next({ active: 'clear', list: this._cached });
this.di('clear all catch');
};
/**
* 移动缓存数据
* @param url 要移动的URL地址
* @param position 新位置,下标从 `0` 开始
*
* @example
* ```
* // source
* [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
* move('/a/1', 2);
* // output
* [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
* move('/a/1', -1);
* // output
* [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
* ```
*/
/**
* 移动缓存数据
* \@example
* ```
* // source
* [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
* move('/a/1', 2);
* // output
* [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
* move('/a/1', -1);
* // output
* [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
* ```
* @param {?} url 要移动的URL地址
* @param {?} position 新位置,下标从 `0` 开始
*
* @return {?}
*/
ReuseTabService.prototype.move = /**
* 移动缓存数据
* \@example
* ```
* // source
* [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
* move('/a/1', 2);
* // output
* [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
* move('/a/1', -1);
* // output
* [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
* ```
* @param {?} url 要移动的URL地址
* @param {?} position 新位置,下标从 `0` 开始
*
* @return {?}
*/
function (url, position) {
/** @type {?} */
var start = this._cached.findIndex((/**
* @param {?} w
* @return {?}
*/
function (w) { return w.url === url; }));
if (start === -1)
return;
/** @type {?} */
var data = this._cached.slice();
data.splice(position < 0 ? data.length + position : position, 0, data.splice(start, 1)[0]);
this._cached = data;
this._cachedChange.next({
active: 'move',
url: url,
position: position,
list: this._cached,
});
};
/**
* 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
*/
/**
* 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
* @param {?} newUrl
* @return {?}
*/
ReuseTabService.prototype.replace = /**
* 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
* @param {?} newUrl
* @return {?}
*/
function (newUrl) {
/** @type {?} */
var url = this.curUrl;
if (this.exists(url)) {
this.close(url, true);
}
else {
this.removeUrlBuffer = url;
}
this.injector.get(Router).navigateByUrl(newUrl);
};
/**
* 获取标题,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
* 2. 路由配置中 data 属性中包含 titleI18n > title
* 3. 菜单数据中 text 属性
*
* @param url 指定URL
* @param route 指定路由快照
*/
/**
* 获取标题,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
* 2. 路由配置中 data 属性中包含 titleI18n > title
* 3. 菜单数据中 text 属性
*
* @param {?} url 指定URL
* @param {?=} route 指定路由快照
* @return {?}
*/
ReuseTabService.prototype.getTitle = /**
* 获取标题,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
* 2. 路由配置中 data 属性中包含 titleI18n > title
* 3. 菜单数据中 text 属性
*
* @param {?} url 指定URL
* @param {?=} route 指定路由快照
* @return {?}
*/
function (url, route) {
if (this._titleCached[url]) {
return this._titleCached[url];
}
if (route && route.data && (route.data.titleI18n || route.data.title)) {
return (/** @type {?} */ ({
text: route.data.title,
i18n: route.data.titleI18n,
}));
}
/** @type {?} */
var menu = this.getMenu(url);
return menu ? { text: menu.text, i18n: menu.i18n } : { text: url };
};
/**
* 清除标题缓存
*/
/**
* 清除标题缓存
* @return {?}
*/
ReuseTabService.prototype.clearTitleCached = /**
* 清除标题缓存
* @return {?}
*/
function () {
this._titleCached = {};
};
Object.defineProperty(ReuseTabService.prototype, "closable", {
/** 自定义当前 `closable` 状态 */
set: /**
* 自定义当前 `closable` 状态
* @param {?} value
* @return {?}
*/
function (value) {
/** @type {?} */
var url = this.curUrl;
this._closableCached[url] = value;
this.di('update current tag closable: ', value);
this._cachedChange.next({
active: 'closable',
closable: value,
list: this._cached,
});
},
enumerable: true,
configurable: true
});
/**
* 获取 `closable` 状态,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
* 2. 路由配置中 data 属性中包含 `reuseClosable`
* 3. 菜单数据中 `reuseClosable` 属性
*
* @param url 指定URL
* @param route 指定路由快照
*/
/**
* 获取 `closable` 状态,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
* 2. 路由配置中 data 属性中包含 `reuseClosable`
* 3. 菜单数据中 `reuseClosable` 属性
*
* @param {?} url 指定URL
* @param {?=} route 指定路由快照
* @return {?}
*/
ReuseTabService.prototype.getClosable = /**
* 获取 `closable` 状态,顺序如下:
*
* 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
* 2. 路由配置中 data 属性中包含 `reuseClosable`
* 3. 菜单数据中 `reuseClosable` 属性
*
* @param {?} url 指定URL
* @param {?=} route 指定路由快照
* @return {?}
*/
function (url, route) {
if (typeof this._closableCached[url] !== 'undefined')
return this._closableCached[url];
if (route && route.data && typeof route.data.reuseClosable === 'boolean')
return route.data.reuseClosable;
/** @type {?} */
var menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
if (menu && typeof menu.reuseClosable === 'boolean')
return menu.reuseClosable;
return true;
};
/**
* 清空 `closable` 缓存
*/
/**
* 清空 `closable` 缓存
* @return {?}
*/
ReuseTabService.prototype.clearClosableCached = /**
* 清空 `closable` 缓存
* @return {?}
*/
function () {
this._closableCached = {};
};
/**
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.getTruthRoute = /**
* @param {?} route
* @return {?}
*/
function (route) {
/** @type {?} */
var next = route;
while (next.firstChild)
next = next.firstChild;
return next;
};
/**
* 根据快照获取URL地址
*/
/**
* 根据快照获取URL地址
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.getUrl = /**
* 根据快照获取URL地址
* @param {?} route
* @return {?}
*/
function (route) {
/** @type {?} */
var next = this.getTruthRoute(route);
/** @type {?} */
var segments = [];
while (next) {
segments.push(next.url.join('/'));
next = (/** @type {?} */ (next.parent));
}
/** @type {?} */
var url = '/' +
segments
.filter((/**
* @param {?} i
* @return {?}
*/
function (i) { return i; }))
.reverse()
.join('/');
return url;
};
/**
* 检查快照是否允许被复用
*/
/**
* 检查快照是否允许被复用
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.can = /**
* 检查快照是否允许被复用
* @param {?} route
* @return {?}
*/
function (route) {
/** @type {?} */
var url = this.getUrl(route);
if (url === this.removeUrlBuffer)
return false;
if (route.data && typeof route.data.reuse === 'boolean')
return route.data.reuse;
if (this.mode !== ReuseTabMatchMode.URL) {
/** @type {?} */
var menu = this.getMenu(url);
if (!menu)
return false;
if (this.mode === ReuseTabMatchMode.Menu) {
if (menu.reuse === false)
return false;
}
else {
if (!menu.reuse || menu.reuse !== true)
return false;
}
return true;
}
return this.excludes.findIndex((/**
* @param {?} r
* @return {?}
*/
function (r) { return r.test(url); })) === -1;
};
/**
* 刷新,触发一个 refresh 类型事件
*/
/**
* 刷新,触发一个 refresh 类型事件
* @param {?=} data
* @return {?}
*/
ReuseTabService.prototype.refresh = /**
* 刷新,触发一个 refresh 类型事件
* @param {?=} data
* @return {?}
*/
function (data) {
this._cachedChange.next({ active: 'refresh', data: data });
};
// #endregion
// #region privates
// #endregion
// #region privates
/**
* @private
* @param {?} _handle
* @return {?}
*/
ReuseTabService.prototype.destroy =
// #endregion
// #region privates
/**
* @private
* @param {?} _handle
* @return {?}
*/
function (_handle) {
if (_handle && _handle.componentRef && _handle.componentRef.destroy)
_handle.componentRef.destroy();
};
/**
* @private
* @param {...?} args
* @return {?}
*/
ReuseTabService.prototype.di = /**
* @private
* @param {...?} args
* @return {?}
*/
function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
if (!this.debug)
return;
// tslint:disable-next-line:no-console
console.warn.apply(console, __spread(args));
};
/**
* @return {?}
*/
ReuseTabService.prototype.init = /**
* @return {?}
*/
function () {
this.initScroll();
this._inited = true;
};
/**
* @private
* @param {?} url
* @return {?}
*/
ReuseTabService.prototype.getMenu = /**
* @private
* @param {?} url
* @return {?}
*/
function (url) {
/** @type {?} */
var menus = this.menuService.getPathByUrl(url);
if (!menus || menus.length === 0)
return null;
return menus.pop();
};
/**
* @private
* @param {?} method
* @param {?} _url
* @param {?} comp
* @return {?}
*/
ReuseTabService.prototype.runHook = /**
* @private
* @param {?} method
* @param {?} _url
* @param {?} comp
* @return {?}
*/
function (method, _url, comp) {
if (comp.instance && typeof comp.instance[method] === 'function')
comp.instance[method]();
};
/**
* @private
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.hasInValidRoute = /**
* @private
* @param {?} route
* @return {?}
*/
function (route) {
return !route.routeConfig || route.routeConfig.loadChildren || route.routeConfig.children;
};
/**
* 决定是否允许路由复用,若 `true` 会触发 `store`
*/
/**
* 决定是否允许路由复用,若 `true` 会触发 `store`
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.shouldDetach = /**
* 决定是否允许路由复用,若 `true` 会触发 `store`
* @param {?} route
* @return {?}
*/
function (route) {
if (this.hasInValidRoute(route))
return false;
this.di('#shouldDetach', this.can(route), this.getUrl(route));
return this.can(route);
};
/**
* 存储
*/
/**
* 存储
* @param {?} _snapshot
* @param {?} _handle
* @return {?}
*/
ReuseTabService.prototype.store = /**
* 存储
* @param {?} _snapshot
* @param {?} _handle
* @return {?}
*/
function (_snapshot, _handle) {
/** @type {?} */
var url = this.getUrl(_snapshot);
/** @type {?} */
var idx = this.index(url);
/** @type {?} */
var item = {
title: this.getTitle(url, _snapshot),
closable: this.getClosable(url, _snapshot),
position: this.getKeepingScroll(url, _snapshot) ? this.positionBuffer[url] : null,
url: url,
_snapshot: _snapshot,
_handle: _handle,
};
if (idx === -1) {
if (this.count >= this._max) {
// Get the oldest closable location
/** @type {?} */
var closeIdx = this._cached.findIndex((/**
* @param {?} w
* @return {?}
*/
function (w) { return (/** @type {?} */ (w.closable)); }));
if (closeIdx !== -1)
this.remove(closeIdx, false);
}
this._cached.push(item);
}
else {
this._cached[idx] = item;
}
this.removeUrlBuffer = null;
this.di('#store', idx === -1 ? '[new]' : '[override]', url);
if (_handle && _handle.componentRef) {
this.runHook('_onReuseDestroy', url, _handle.componentRef);
}
this._cachedChange.next({ active: 'add', item: item, list: this._cached });
};
/**
* 决定是否允许应用缓存数据
*/
/**
* 决定是否允许应用缓存数据
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.shouldAttach = /**
* 决定是否允许应用缓存数据
* @param {?} route
* @return {?}
*/
function (route) {
if (this.hasInValidRoute(route))
return false;
/** @type {?} */
var url = this.getUrl(route);
/** @type {?} */
var data = this.get(url);
/** @type {?} */
var ret = !!(data && data._handle);
this.di('#shouldAttach', ret, url);
if (ret && (/** @type {?} */ (data))._handle.componentRef) {
this.runHook('_onReuseInit', url, (/** @type {?} */ (data))._handle.componentRef);
}
return ret;
};
/**
* 提取复用数据
*/
/**
* 提取复用数据
* @param {?} route
* @return {?}
*/
ReuseTabService.prototype.retrieve = /**
* 提取复用数据
* @param {?} route
* @return {?}
*/
function (route) {
if (this.hasInValidRoute(route))
return null;
/** @type {?} */
var url = this.getUrl(route);
/** @type {?} */
var data = this.get(url);
/** @type {?} */
var ret = (data && data._handle) || null;
this.di('#retrieve', url, ret);
return ret;
};
/**
* 决定是否应该进行复用路由处理
*/
/**
* 决定是否应该进行复用路由处理
* @param {?} future
* @param {?} curr
* @return {?}
*/
ReuseTabService.prototype.shouldReuseRoute = /**
* 决定是否应该进行复用路由处理
* @param {?} future
* @param {?} curr
* @return {?}
*/
function (future, curr) {
/** @type {?} */
var ret = future.routeConfig === curr.routeConfig;
if (!ret)
return false;
/** @type {?} */
var path = (/** @type {?} */ (((future.routeConfig && future.routeConfig.path) || '')));
if (path.length > 0 && ~path.indexOf(':')) {
/** @type {?} */
var futureUrl = this.getUrl(future);
/** @type {?} */
var currUrl = this.getUrl(curr);
ret = futureUrl === currUrl;
}
this.di('=====================');
this.di('#shouldReuseRoute', ret, this.getUrl(curr) + "=>" + this.getUrl(future), future, curr);
return ret;
};
// #region scroll
/**
* 获取 `keepingScroll` 状态,顺序如下:
*
* 1. 路由配置中 data 属性中包含 `keepingScroll`
* 2. 菜单数据中 `keepingScroll` 属性
* 3. 组件 `keepingScroll` 值
*/
// #region scroll
/**
* 获取 `keepingScroll` 状态,顺序如下:
*
* 1. 路由配置中 data 属性中包含 `keepingScroll`
* 2. 菜单数据中 `keepingScroll` 属性
* 3. 组件 `keepingScroll` 值
* @param {?} url
* @param {?=} route
* @return {?}
*/
ReuseTabService.prototype.getKeepingScroll =
// #region scroll
/**
* 获取 `keepingScroll` 状态,顺序如下:
*
* 1. 路由配置中 data 属性中包含 `keepingScroll`
* 2. 菜单数据中 `keepingScroll` 属性
* 3. 组件 `keepingScroll` 值
* @param {?} url
* @param {?=} route
* @return {?}
*/
function (url, route) {
if (route && route.data && typeof route.data.keepingScroll === 'boolean')
return route.data.keepingScroll;
/** @type {?} */
var menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
if (menu && typeof menu.keepingScroll === 'boolean')
return menu.keepingScroll;
return this.keepingScroll;
};
Object.defineProperty(ReuseTabService.prototype, "isDisabledInRouter", {
get: /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var routerConfig = this.injector.get(ROUTER_CONFIGURATION, (/** @type {?} */ ({})));
return routerConfig.scrollPositionRestoration === 'disabled';
},
enumerable: true,
configurable: true
});
Object.defineProperty(ReuseTabService.prototype, "ss", {
get: /**
* @private
* @return {?}
*/
function () {
return this.injector.get(ScrollService);
},
enumerable: true,
configurable: true
});
/**
* @private
* @return {?}
*/
ReuseTabService.prototype.initScroll = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this._router$) {
this._router$.unsubscribe();
}
this._router$ = this.injector.get(Router).events.subscribe((/**
* @param {?} e
* @return {?}
*/
function (e) {
if (e instanceof NavigationStart) {
/** @type {?} */
var url = _this.curUrl;
if (_this.getKeepingScroll(url, _this.getTruthRoute(_this.snapshot))) {
_this.positionBuffer[url] = _this.ss.getScrollPosition(_this.keepingScrollContainer);
}
else {
delete _this.positionBuffer[url];
}
}
else if (e instanceof NavigationEnd) {
/** @type {?} */
var url = _this.curUrl;
/** @type {?} */
var item_1 = _this.get(url);
if (item_1 && item_1.position && _this.getKeepingScroll(url, _this.getTruthRoute(_this.snapshot))) {
if (_this.isDisabledInRouter) {
_this.ss.scrollToPosition(_this.keepingScrollContainer, item_1.position);
}
else {
setTimeout((/**
* @return {?}
*/
function () { return _this.ss.scrollToPosition(_this.keepingScrollContainer, (/** @type {?} */ (item_1.position))); }), 1);
}
}
}
}));
};
// #endregion
// #endregion
/**
* @return {?}
*/
ReuseTabService.prototype.ngOnDestroy =
// #endregion
/**
* @return {?}
*/
function () {
var _a = this, _cachedChange = _a._cachedChange, _router$ = _a._router$;
this.clear();
this._cached = [];
_cachedChange.complete();
if (_router$) {
_router$.unsubscribe();
}
};
ReuseTabService.decorators = [
{ type: Injectable, args: [{ providedIn: 'root' },] }
];
/** @nocollapse */
ReuseTabService.ctorParameters = function () { return [
{ type: Injector },
{ type: MenuService }
]; };
/** @nocollapse */ ReuseTabService.ɵprov = i0.ɵɵdefineInjectable({ factory: function ReuseTabService_Factory() { return new ReuseTabService(i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i1.MenuService)); }, token: ReuseTabService, providedIn: "root" });
return ReuseTabService;
}());
export { ReuseTabService };
if (false) {
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._inited;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._max;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._keepingScroll;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._cachedChange;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._cached;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._titleCached;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._closableCached;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype._router$;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype.removeUrlBuffer;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype.positionBuffer;
/** @type {?} */
ReuseTabService.prototype.debug;
/** @type {?} */
ReuseTabService.prototype.mode;
/**
* 排除规则,限 `mode=URL`
* @type {?}
*/
ReuseTabService.prototype.excludes;
/** @type {?} */
ReuseTabService.prototype.keepingScrollContainer;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype.injector;
/**
* @type {?}
* @private
*/
ReuseTabService.prototype.menuService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1c2UtdGFiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AbHhsaWIvc2VlZC9yZXVzZS10YWIvIiwic291cmNlcyI6WyJyZXVzZS10YWIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsY0FBYyxFQUdkLGFBQWEsRUFDYixlQUFlLEVBQ2YsTUFBTSxFQUNOLG9CQUFvQixHQUNyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFELE9BQU8sRUFBRSxlQUFlLEVBQThCLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBa0IsaUJBQWlCLEVBQThCLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7O0FBT3ZHO0lBK1RFLGFBQWE7SUFFYix5QkFBb0IsUUFBa0IsRUFBVSxXQUF3QjtRQUFwRCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUEvVGhFLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUNWLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQXdCLElBQUksQ0FBQyxDQUFDO1FBQ2pFLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQy9CLGlCQUFZLEdBQWtDLEVBQUUsQ0FBQztRQUNqRCxvQkFBZSxHQUErQixFQUFFLENBQUM7UUFHakQsbUJBQWMsR0FBd0MsRUFBRSxDQUFDO1FBQ2pFLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxTQUFJLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDOzs7O1FBRTlCLGFBQVEsR0FBYSxFQUFFLENBQUM7SUFrVG1ELENBQUM7SUFoVDVFLHNCQUFZLHFDQUFROzs7OztRQUFw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