- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试修复在页面上搜索时遇到的错误。我有一个组件可以在我的所有设置中进行搜索,如下所示:
一切正常,搜索返回了它应该返回的值,但是当我删除搜索条件时,我注意到条件的第一个字母仍然显示并且不会消失,即使搜索设置字段是空的,就像这样:
经过两个小时检查代码,我可以看到代码中的问题所在,但我不知道如何修复它。
这是我组件的 html:
<mat-form-field appearance="standard">
<input matInput
pageSearch
placeholder="{{'searchSettings'|translate}}">
</mat-form-field>
如您所见,我使用了一个名为 pageSearch
的指令,该指令定义如下,并包含一个在每次释放键盘按键时执行的方法 valueChange
:
ngAfterViewInit() {
const subscription = this.router.events
.pipe(filter(e => e instanceof NavigationStart))
.subscribe(event => {
if (event) {
this.pageSearchService.term.next('');
}
}
);
this.subscriptionsManager.add(subscription);
}
@HostListener('keyup')
valueChange() {
this.pageSearchService.term.next(
this.elementRef.nativeElement.value
);
}
该指令使用pageSearchService
,定义如下:
@Injectable()
export class PageSearchService {
/**
* Current search term.
*/
term: BehaviorSubject<string>;
/**
* Event to emit when visibility should change in the searchable.
*/
searchableMatch: EventEmitter<any> = new EventEmitter<any>();
constructor() {
this.term = new BehaviorSubject('');
}
}
我有一个轻微的想法,问题可能是它总是期待一个 next()
值,当它为空时,它只是不运行,但它的最后一个值是仍然卡住在那里。
我尝试更改指令中的方法valueChange
,但每次我最终都会关闭对BehaviorSubject的订阅。这些是我尝试过的事情:
BehaviorSubject
valueChange() {
if (this.elementRef.nativeElement.value !== '') {
this.pageSearchService.term.next(
this.elementRef.nativeElement.value
);
}
}
没用,我也试过退订再订阅,也没用
valueChange() {
if (this.elementRef.nativeElement.value !== '') {
this.pageSearchService.term.next(
this.elementRef.nativeElement.value
);
} else {
this.pageSearchService.term.unsubscribe();
this.pageSearchService.term._subscribe(this.elementRef.nativeElement.value);
}
}
它给了我这个错误:
所以现在我不知道还能做什么。在给定字符串 ''
的情况下,如何要求指令不以某种方式运行?
searchableMatch
EventEmitter 被其他 3 个指令使用,如下:
SearchNoResults指令:
export class SearchNoResultsDirective implements AfterViewInit, OnDestroy {
@Input('searchNoResults') sectionsId: string[];
subscriptionsManager: Subscription = new Subscription();
visibility: {
term: string,
visible: boolean
} = {
term: '',
visible: true
};
constructor(private elementRef: ElementRef,
private renderer: Renderer2,
private pageSearchService: PageSearchService) {
}
.
.
.
ngAfterViewInit() {
const subscription = this.pageSearchService.searchableMatch.subscribe(match => {
if (this.sectionsId.indexOf(match.sectionId) >= 0 ) {
this.update({
term: match.term,
visible: match.visible
});
}
});
this.subscriptionsManager.add(subscription);
}
}
SearchableSectionDirective:
export class SearchableSectionDirective extends BaseClass implements AfterViewInit {
@Input('searchableSection') sectionId: string;
.
.
.
ngAfterViewInit() {
const subscription = this.pageSearchService.searchableMatch.subscribe(match => {
if (match.sectionId === this.sectionId) {
this.update({
term: match.term,
visible: match.visible
});
}
});
this.subscriptionsManager.add(subscription);
}
}
和 SearchableDirective:
export class SearchableDirective implements AfterViewInit, OnDestroy {
@Input('searchable') sectionId: string;
@Input() highlightColor = '#FFF176';
match: EventEmitter<any> = new EventEmitter<any>();
subscriptionsManager: Subscription = new Subscription();
originalText: string;
ngAfterViewInit() {
this.originalText = this.elementRef.nativeElement.innerText;
this.subscriptionsManager.add(
this.pageSearchService.term.subscribe(term => this.checkIfMatch(term))
);
}
checkIfMatch(val: string) {
let match = false;
let clean = false;
if (val) {
const startInd = this.originalText.toLowerCase().indexOf(val.trim().toLowerCase());
if (startInd > -1) {
match = true;
const startText = this.render.createText(this.originalText.slice(0, startInd));
const matchText = this.render.createText(this.originalText.slice(startInd, startInd + val.trim().length));
const endText = this.render.createText(this.originalText.slice(startInd + val.trim().length, this.originalText.length));
const matchSpan = this.render.createElement('span');
this.render.appendChild(
matchSpan,
matchText
);
this.render.setStyle(
matchSpan,
'background',
this.highlightColor
);
this.elementRef.nativeElement.innerHTML = '';
this.render.appendChild(
this.elementRef.nativeElement,
startText
);
this.render.appendChild(
this.elementRef.nativeElement,
matchSpan
);
this.render.appendChild(
this.elementRef.nativeElement,
endText
);
} else {
clean = true;
}
} else if (this.originalText) {
clean = true;
}
**if (clean) {
// this is how the solution looks
this.elementRef.nativeElement.innerHTML = this.originalText;
}**
if (this.sectionId) {
this.pageSearchService.searchableMatch.emit({
sectionId: this.sectionId,
term: val,
visible: match
});
this.match.emit({
term: val,
visible: match
});
}
}
}
我正在查看这 3 个指令,看看是否发现问题。
最佳答案
我认为唯一的问题是你放置逻辑的函数。我认为你只需要添加 checkIfMatch
checkIfMatch(val: string) {
let match = false;
let clean = false;
if (val) {
//func logic
} else {
// you need to add else block to the function
this.elementRef.nativeElement.innerHTML = this.originalText;
}
}
关于angular - 如何从指令行为中排除特殊情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59272051/
我有一个名为“members”的数据库表。分配给成员的是一个职位。 职位 来自部门。我有 Departments,然后是那些中的 Sub-Departments 和 Sub-Departments 中
我正在尝试为 Solr 搜索应用过滤器标记 Tagging_and_excluding_Filters . 挑战在于同时应用多个标记(对于单个页面上的多个选择选项)。例如 q=mainquery&fq
我知道这个问题已经被问过很多次了,我已经尝试了所有建议,并阅读了有关不同选择器等的所有内容,但没有任何对我有用 给出以下 HTML 片段: link
是否有直接的 LINQ 语法来查找集合 B 中不存在的集合 A 的成员?在 SQL 我会写这个 SELECT A.* FROM A LEFT JOIN B ON A.ID = B.ID WHERE B
我试图排除并在现有xpath中包括以下xpath,但不太确定如何做到这一点 //exclude -> //*[@id="ires"]/ol/li[6]/div/a[1]/img //include
我有 30 个站点,我需要在其中 24 个站点上回显某些内容。我怎样才能排除其他人?该代码不起作用,因为我认为它的逻辑是假的:) $currentsite = get_bloginfo('wpurl'
我需要对目标文件夹进行检查,并检查文件是否来自今天,并且超过5kb 下面的命令根据使用今天的日期存在的文件来提供bool值,但是我还要添加-gt5kb之类的排除项 我尝试使用-Exlcude,但不确定
我编入索引的Elasticsearch文档包含许多字段。我一直在使用match_all查询来获取结果。我想从match_all中排除一些字段,这可能吗? 最佳答案 在Elasticsearch中,您可
我正在为我的 DAO 编写一些测试,因为很多测试使用保存到我的数据库中的测试对象,所以我使用注释 @Before 和 @Before 创建了 setup() 和teardown() 方法@After
我编写了一个程序来解决以下问题: Implement a diffusion limited aggregation simulation on a toroid plane where seeds
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
很多时候我必须运行这个查询: select * from users where name is not null and name != '' 有没有更好的方法来做到这一点。我需要更多的性能,任何建
如果检测到某个操作系统,是否有一种简单的方法可以排除某些代码? 我设计了一个运行良好的网站(它是一个 sidescroller),当使用滚轮(向上/向下)时,它会左右滚动。但是,如果您使用的是 Mac
我应该如何排除“IN”子句中的值? $Graduates = "45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,6
很明显,如果一个 Mysql 表的全文索引包含一个出现在 50% 的数据行中的关键字,该关键字将被匹配查询忽略 因此,如果我有一个包含 50 个条目的全文索引“content”的表其中 27 个条目在
我有下面的循环。 我需要提取所有不包含字母 p 的名称 (lskey),但我的尝试不起作用。 for(var i = 0; i "); } } 如果有人能回答,我将不胜感激。 最佳答案 如此接
我正在尝试查找 FTP 服务器上根目录的总大小。但是,我无权访问根目录中的其中一个目录。 我想用这个函数对根目录的大小求和: size = 0 for filename in ftp.nlst("."
我有以下正则表达式来匹配 html 链接: 有点效果。除了不是真的。因为它在 编辑: 这将使它只抓取引号而不是 之后的所有内容 最佳答案 我认为您的正则表达式没有按照您的意愿行事。 这会非贪婪地捕
我在提出异常方面遇到困难,例如: import csv o = open('/home/foo/dummy.csv', 'r') # Empty file! reader = csv.reader(o
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我是一名优秀的程序员,十分优秀!