小编Cle*_*ent的帖子

如何关闭外部点击的下拉菜单?

当用户点击该下拉菜单之外的任何地方时,我想关闭我的登录菜单下拉菜单,我想用Angular2和Angular2"方法"来做...

我已经实施了一个解决方案,但我真的对它没有信心.我认为必须有一种最简单的方法来实现相同的结果,所以如果你有任何想法......让我们讨论:)!

这是我的实现:

下拉组件:

这是我的下拉列表的组件:

  • 每次将此组件设置为可见时(例如:当用户单击按钮以显示它时),它会订阅存储在SubjectsService中的"全局"rxjs主题userMenu.
  • 每次隐藏时,它都会取消订阅此主题.
  • 该组件的模板中的任何位置的每次单击都会触发onClick()方法,该方法只是将事件冒泡停止到顶部(和应用程序组件)

这是代码

export class UserMenuComponent {

    _isVisible: boolean = false;
    _subscriptions: Subscription<any> = null;

    constructor(public subjects: SubjectsService) {
    }

    onClick(event) {
        event.stopPropagation();
    }

    set isVisible(v) {
        if( v ){
            setTimeout( () => {
this._subscriptions =  this.subjects.userMenu.subscribe((e) => {
                       this.isVisible = false;
                       })
            }, 0);
        } else {
            this._subscriptions.unsubscribe();
        }
        this._isVisible = v;
    }

    get isVisible() {
        return this._isVisible;
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序组件:

另一方面,有应用程序组件(它是下拉组件的父级):

  • 此组件捕获每个单击事件并在相同的rxjs上发出主题(userMenu)

这是代码: …

javascript rxjs drop-down-menu angular

129
推荐指数
9
解决办法
12万
查看次数

使用rxjs5获取BehaviorSubject的当前值的简单方法

以前在rxjs4中,BehaviorSubject中有一个名为: getValue()(doc here)的方法.

rxjs5中不再存在此方法.

所以我发现获得BehaviorSubject值的唯一解决方案是:

let value;
myBehaviorSubject.take(1).subscribe( (e) => value = e );
Run Code Online (Sandbox Code Playgroud)

这段代码同步运行(我不完全理解为什么,但确实......)并获得了价值.它有效,但它不像getValue()现有的那样干净:

let value = myBehaviorSubject.getValue();
Run Code Online (Sandbox Code Playgroud)

为什么getValue()rxjs5中删除了这个问题最干净的解决方案是什么?

javascript reactive-programming rxjs behaviorsubject rxjs5

31
推荐指数
2
解决办法
2万
查看次数

Angular2变化检测误解 - 用plunker

我正在尝试用Angular2 final完全理解变化检测.

这包括:

  • 处理变更检测策略
  • 从组件上安装和拆卸更换检测器.

我以为我已经对这些概念进行了非常明确的概述,但为了确保我的假设正确,我写了一个小傻瓜来测试它们.

我对全球正确的一般理解,但在某些情况下,我有点迷失.


这是plunker:Angular2变化检测操场

对plunker的快速解释:

很简单:

  • 一个父组件,您可以在其中编辑一个将传递给两个子组件的属性:
  • 将具有变化检测策略的孩子设置为OnPush
  • 将具有更改检测策略的子项设置为"默认"

parent属性可以通过以下任一方式传递给子组件:

  • 更改整个属性对象,并创建一个新对象(" 更改obj "按钮)(触发OnPush子项上的更改检测)
  • 更改属性对象内的成员("更改内容"按钮)(不会触发OnPush子项上的更改检测)

对于每个子组件,可以附加或分离ChangeDetector.("detach()""reattach()"按钮)

OnPush子项具有可以编辑的附加内部属性,并且可以显式应用更改检测("detectChanges()"按钮)


以下是我得到无法解释的行为的场景:

Scenario1:

  1. 分离OnPush Children和Default Children的更改检测器(单击两个组件上的" detach() ")
  2. 编辑父属性firstname和lastname
  3. 单击" 更改obj "将修改后的属性传递给子项

预期的行为: 我希望两个孩子都不会被更新,因为他们都有自己的变化探测器.

当前行为: 默认子项未更新,但OnPush子项已更新.. 为什么? 它不应该因为它的CD分离...

Scenario2:

  1. 为OnPush组件分离CD
  2. 编辑其内部值输入并单击更改内部:没有任何反应,因为CD已分离,因此未检测到更改...确定
  3. 单击detectChanges():检测到更改并更新视图.到现在为止还挺好.
  4. 再一次,编辑内部值输入并单击更改内部:再次,没有任何事情发生,因为CD已分离,因此未检测到更改..确定
  5. 编辑父属性firstname和lastname.
  6. 单击" 更改obj "将修改后的属性传递给子项

预期的行为: OnPush的孩子不应该全部更新,再次因为它的CD被分离...... CD不应该在这个组件上发生

当前行为: 更新值和内部值,将完整CD等接缝应用于此组件.

  1. 最后一次,编辑内部值输入并单击更改内部:检测到更改,并更新内部值...

预期行为: 不应更新内部值,因为CD仍然已分离

当前行为: …

plunker angular2-changedetection angular

8
推荐指数
1
解决办法
1866
查看次数

Angular2:没有延迟加载的路由器'loadChildren'相当于什么

我正在尝试"插入"包含路由配置(从中导入RouterModule.forChild())的子ngModule(功能模块)到父ngModule中.

使用延迟加载时,使用loadChildren父模块路由配置中的密钥指定"插入"子模块的位置.

例如:

export const parentModuleRouteConfig = [{
    path: 'myfeaturemodule',
    loadChildren: '/app/child.module'
}];
Run Code Online (Sandbox Code Playgroud)

实际上,我不想使用延迟加载.

如何告诉路由器"插入"(或使用)给定路径的子模块中指定的路由配置?

angular2-routing angular

6
推荐指数
1
解决办法
5275
查看次数

Docker创建了两个破坏我的互联网访问的桥梁

我面临一个非常奇怪的问题:

这是我的配置:

  • 码头工人17-ce
  • ubuntu 16.04.

我在两个不同的地方工作,与不同的互联网提供商.

首先,一切正常,我可以运行开箱即用的Docker并访问互联网没有任何问题.

但是在第二个地方,当码头工人正在运行时我无法访问互联网,而且由docker创建的两个虚拟briges正在运行时更加精确.

在这个地方,互联网连接运行非常严格,我可以在8.8.8.8 ping谷歌dns,但几乎所有DNS请求失败,并且几秒钟之后大部分时间互联网连接完全关闭.

(第一和第二位的唯一区别是互联网提供商).

起初我认为我可以通过更改默认网桥ip来解决这个问题,但这根本不能解决问题.

关键是docker守护进程的--bip选项更改了默认的docker bridge docker0的IP ,但是docker还创建了另一个名为br-1a0208f108d9的桥,它不反映传递给--bip选项的设置.

我想这第二座桥会给我的网络带来麻烦,因为它与我的wifi适配器配置重叠.

我很难尝试诊断这一点.

我的问题是:

  • 我怎么能确定我的假设是正确的,并且这第二个布里奇特与我的wifi适配器有冲突
  • 这第二座桥是什么?很容易找到有关docker0桥的文档,但我找不到任何与第二个桥相关的东西br-1a0208f108d9
  • 完全相同的设置如何在一个地方而不是另一个地方工作.

有了这个麻烦,我觉得我非常接近升级我的码头工作知识但在此之前我必须增加我的网络管理知识.

希望你能帮忙.

linux networking docker

6
推荐指数
1
解决办法
2833
查看次数

使用yarn工作空间时lerna bootstrap命令有用吗

我将 lerna 与纱线工作区结合使用。在这种情况下,所有包提升和符号链接都由纱线工作区处理。

在这种特殊情况下,该命令的作用是什么lerna bootsrap?与原始相比,它带来了什么更多的东西吗yarn install?我们应该使用它还是简单地使用yarn install

lerna monorepo yarnpkg

6
推荐指数
1
解决办法
1931
查看次数

简单的docker-compose有两个服务:nginx和php

我开始使用Dockernginx,我正在尝试设置一个运行的两个容器环境:

  • nginx:latest 在一边
  • php:fpm 另一方面

我遇到php-fpm问题:我总是遇到502 Bad Gateway错误.

我的设置很简单($TEST_DIR是我的工作目录).

我的Docker组成配置TEST_DIR/docker-compose.yml:

nginx:
    image: nginx
    ports:
        - "8080:80"
    volumes:
        - ./www:/usr/share/nginx/html
        - ./conf/nginx.conf:/nginx.conf
        - ./logs/nginx:/var/log/nginx
    links:
        - php:php
    command: nginx -c /nginx.conf

php:
    image: php:fpm
    ports:
        - "9000:9000"
    volumes:
        - ./www:/var/www/html
Run Code Online (Sandbox Code Playgroud)

nginx配置$TEST_DIR/conf/nginx.conf:

user  nginx;
worker_processes  1;
pid        /var/run/nginx.pid;

events {
    worker_connections  2048;
    multi_accept on;
    use epoll;
}

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" …
Run Code Online (Sandbox Code Playgroud)

php gateway nginx docker docker-compose

5
推荐指数
1
解决办法
3279
查看次数

RxJS和AngularJS HTTP - 我该如何实现?

我正在编写一个小实用程序函数,它使用必要的身份验证标头包含对AngularJS http.get的调用:

get(endpoint: string): Observable {
    var headers = new Headers();
    this._appendAuthentificationHeaders( headers, this.user.credentials);

    return this.http.get(endpoint, { headers: headers })
            .map(res => res.json());
}
Run Code Online (Sandbox Code Playgroud)

这里的要点是,如果this.user为null,则该方法将崩溃.所以我有三个选择:

  1. 返回null并检查每次调用的返回值...
  2. 抛出一个例外
  3. 找到一种方法来返回一个直接触发错误处理程序的RxJS Observable对象.

我想实现第三种方法,因为它允许我统一这个方法的行为:无论发生什么,它总是返回一个observable.

  • 你知道怎么做吗?
  • 我是否必须创建一个新的Observable并将这两个合并?
  • 我能做什么?

http observable rxjs angular

5
推荐指数
1
解决办法
518
查看次数

Angular2,预编译功能模块时的元数据错误

我正在使用Angular2 RC6编写Angular2库.

该库包含一个模块:

import { Component, OnInit, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

@Component({
    selector: 'yeva',
    template: '<div></div>'
})
export class YevaComponent  {
    constructor() { }
}


@NgModule({
  imports: [CommonModule],
  declarations: [YevaComponent],
  providers: [],
  exports: [YevaComponent]
})
export class YevaModule {

}
Run Code Online (Sandbox Code Playgroud)

如果我将此代码复制粘贴到现有Angular2应用程序中的TypeScript文件中,并尝试直接使用此模块,则它可以完美地运行...

但我的目标是建立一个外部的npm库.

如果我在一个独立项目中移动这个完全相同的代码:

https://github.com/ClementVidal/starter.yeva

(此项目配置为用作Angular2库,使用TypeScript进行编译,以供客户端应用程序使用.)

我收到以下错误:

模块'AppModule'导入的意外值'YevaModule'

以下是我在两种情况下导入模块的方法:

@NgModule({
  imports: [BrowserModule,YevaModule],
  declarations: [AppComponent],
  providers: [
    FOUNDATION_PROVIDERS
  ],
  bootstrap: [AppComponent]
})
export class AppModule {

}
Run Code Online (Sandbox Code Playgroud)

此错误来自Angular编译器:

var importedMeta = _this.getNgModuleMetadata(importedModuleType, false);
if (importedMeta === …
Run Code Online (Sandbox Code Playgroud)

module npm typescript angular

5
推荐指数
1
解决办法
1134
查看次数

JQuery 事件是否可以与 Dom addEventListener 一起使用?

我在我的项目中使用 Bootstrap4 alpha,并且出于某些调查目的,我正在尝试使用 DOM 捕获 JQuery 事件 addEventListener()

该事件是$("#mypanel").trigger("shown.bs.collapse")通过引导程序在折叠时使用 JQuery函数触发的组件中的。

如果我尝试使用 JQuery$("#mypanel").on("shown.bs.collapse", ... )函数捕获它,则一切正常。但如果我使用$("#mypanel").get(0).addEventListener("shown.bs.collapse", ... )在相应的 DOM 元素上使用,则不会“捕获”该事件

JQuery 事件系统和标准 DOM 事件系统不兼容吗?

让我认为它们实际上不兼容的一件事是,如果我使用 ChromemonitorEvents()功能来跟踪“shown.bs.collapse”事件,它根本不会出现。

欢迎任何关于此的反馈。

克莱门特

jquery dom event-handling jquery-events bootstrap-4

4
推荐指数
1
解决办法
1231
查看次数

Angular - 使用createEmbeddedView设置上下文

我正在努力将上下文数据传递给动态创建的嵌入视图.

注意:我正在使用Angular 2.4.7

这是我想要实现的目标:


在我的DialogPresetComponent (dialog-preset.component.html)中:

该组件的视图包含一堆模板,可以在我的对话框架中使用:

<template #presetInfo>
   {{options.description}} // Note this binding ! Here is the problem
</template>
Run Code Online (Sandbox Code Playgroud)

仍然在这个组件中,我得到了这样的模板:

@ViewChild('presetInfo', { read: TemplateRef }) presetInfo: TemplateRef<any>;
Run Code Online (Sandbox Code Playgroud)

然后,我将此templateRef存储在DialogService中,以便稍后我可以从其他地方访问它们.


DialogComponent (dialog.component.html)中:

这是我模态的模板:

<div class='c-header'>
</div>
<div class='c-body'>
    <div #container></div>
</div>
<div class='c-footer'>
</div>
Run Code Online (Sandbox Code Playgroud)

DialogComponent (dialog.component.ts)中:

在我的DialogComponent中获取对容器的引用,如下所示:

@ViewChild('container', {read: ViewContainerRef }) containerRef: ViewContainerRef;
Run Code Online (Sandbox Code Playgroud)

我还定义了我想从动态注入的模板访问的属性:

options: DialogOptions = { title: 'Dialog title' };
Run Code Online (Sandbox Code Playgroud)

我想做什么:

我试图把模板#presetInfo的内#container的和我的背景下DialogComponent

最后,我在我的组件中注入我的模板,为其提供正确的上下文:

在我的DialogComponent …

javascript templates angular

4
推荐指数
1
解决办法
3861
查看次数

Javascript API,用于显式添加微任务或宏任务

根据我对javascript虚拟机如何工作的全球理解,我可以清楚地看到微任务/宏任务的概念起着重要作用.


以下是我对此的理解:

  • VM'turn'是将一个宏任务从VM宏任务队列中拉出来并执行它的事实.
  • 在VM转弯期间,可以将微任务添加到当前宏任务的微任务队列中.
  • 微任务可以将其他微任务推送到当前宏任务的微任务队列.
  • 当微任务队列为空时,VM转弯将结束.

以下是我的问题:

为什么没有明确的API来操纵这两个队列.

就像是

  • pushToMacroTask( function )
  • pushToMicroTask( function )

实际上,接触操作这些队列的唯一方法就是使用setTimeout()将任务添加到宏任务队列Promises并将任务添加到微任务队列......

我很好,但是这并没有给我们一个有意义的API,你不觉得吗?

这个概念是否应该保留给JS开发者"隐藏"并仅用于某些hacky情况?

你知道围绕这个主题是否有任何W3C规范?

所有VM引擎都以同样的方式实现这个概念吗?

我很乐意听到有关这方面的故事和意见.

谢谢 !

javascript w3c asynchronous vm-implementation

2
推荐指数
1
解决办法
504
查看次数