小编Dol*_*lan的帖子

Spring使用STOMP的多个房间

是否可以创建STOMP和Spring 4的房间?Socket.IO有内置的房间,所以我想知道Spring是否有这个

我的代码目前:

@MessageMapping("/room/greet/{room}")
@SendTo("/room/{room}")
public Greeting greet(@DestinationVariable String room, HelloMessage message) throws Exception {
    return new Greeting("Hello, " + room + "!");
}
Run Code Online (Sandbox Code Playgroud)

@SendTo("/ room/{room}")是理想的选择

但是,我受限于:

@SendTo("/room/room1") 
@SendTo("/room/room2")
@SendTo("/room/room3") 
Run Code Online (Sandbox Code Playgroud)

等......这非常非常不合理

客户是:

stompClient.subscribe('/room/' + roomID, function(greeting){
    showGreeting(JSON.parse(greeting.body).content);
});
Run Code Online (Sandbox Code Playgroud)

roomID可以是room1,room2或room3 ...如果我想要更多房间怎么办?现在感觉就像这样的痛苦

spring stomp websocket spring-websocket

10
推荐指数
1
解决办法
9330
查看次数

Angular2 UpgradeComponent缺少$ injector

我正在尝试升级Angular1组件并在我的Angular2应用程序中使用它遵循"使用Angular 2 Code中的Angular 1组件指令"中的官方Angular2文档,但它会出现以下错误:

error_handler.js:54 TypeError: Cannot read property 'get' of undefined
    at ChartDirective.UpgradeComponent (upgrade_component.js:97)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在第97行仔细检查后,这个.$检查员未定义:

在此输入图像描述

我的代码非常简单:

import { Directive, ElementRef, Injector } from '@angular/core';
import { UpgradeComponent } from '@angular/upgrade/static';

export const coolComponent = {
  template: 'cool',
  controller: function() {
  }
};

@Directive({
    selector: 'app-chart'
})
export class ChartDirective extends UpgradeComponent {

    constructor(elementRef: ElementRef, injector: Injector) {
        super('coolComponent', elementRef, injector);
    }
}
Run Code Online (Sandbox Code Playgroud)

我自己的主要内容是:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);
Run Code Online (Sandbox Code Playgroud)

以下是问题的简化版本,只需极少的复制步骤: …

upgrade web-component angular

10
推荐指数
1
解决办法
940
查看次数

角度路由器过渡动画有条件地向左和向右滑动

我已经阅读了有关Angular的路由器过渡动画的这篇文章:

https://medium.com/google-developer-experts/angular-supercharge-your-router-transitions-using-new-animation-features-v4-3-3eb341ede6c8

和:

路由组件的Angular 2"动画幻灯片"

但是,这太静止了.我希望它左右滑动,并根据标签的顺序正确.

是否可以为此创建路由器动画?我的意思是下面的例子:

https://material.angular.io/components/tabs/examples

看看它是如何载玻片BOTH右很自然地取决于你是什么标签.

这必须是动态的,因为选项卡将在运行时添加.

angular-routing angular angular-animations

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

RxJS/Observable flatMap可以返回Observable或数组

有人可以向我解释为什么.flatMap操作员可以接受返回的函数Observable,或者array

官方的文档说:

FlatMap运算符通过将您指定的函数应用于源Observable发出的每个项来转换Observable,其中该函数返回一个本身发出项的Observable.

为什么它也会返回一个数组

例如,这些都是有效的:

obs$.flatMap((data) => {
    return [];
});

obs$.flatMap((data) => {
    return new Observable<string>();
});
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

obs$.flatMap((data) => {
    return 1;
});
Run Code Online (Sandbox Code Playgroud)

observable rxjs flatmap angular

7
推荐指数
1
解决办法
2475
查看次数

Angular 工作区中“/apps”中应用程序的选择器命名约定是什么?

我的文件夹中有大约 10 个应用程序/apps

s的选择器是否应该@Component带有前缀app-

例如app-root

或者应该全部以应用程序名称作为前缀?

例如,如果调用我的应用程序之一,那么我将有一个名为?FooBar的组件。fb-root另一个项目称为HelloWorld,然后我将有一个名为hw-root

naming-conventions angular

7
推荐指数
1
解决办法
2525
查看次数

Spring 4 STOMP Websockets Heartbeat

我似乎找不到如何在Spring中使用websockets向客户端发送心跳的好资源!

我有一个使用此配置运行的基本服务器:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/room");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/channels").withSockJS();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用这样的东西向订阅房间的人发送消息:

this.simpMessagingTemplate.convertAndSend("/room/" + this.roomId, message);
Run Code Online (Sandbox Code Playgroud)

这是用于与服务器通信的客户端代码:

this.connect = function (roomNameParam, connectionCallback) {
    var socket = new SockJS('http://localhost:8080/channels'),

    self.stompClient = Stomp.over(socket);
    self.stompClient.connect({}, function (frame) {
        self.stompClient.subscribe('/room/' + roomNameParam, connectionCallback);
    });
};
Run Code Online (Sandbox Code Playgroud)

我真的想实现心跳,以便客户端知道谁连接并发送一些数据以保持客户端和服务器同步.

我需要手动操作吗?

java spring stomp websocket

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

同时从 'lodash', 'rxjs', 'ramda' 导入 { map } 而不会影响可读性

如何一个导入mapmerge或从多个进口任何其他功能?

import { map } from 'lodash';
import { map } from 'rxjs/operators';
import { map } from 'ramda';
Run Code Online (Sandbox Code Playgroud)

显而易见的答案是:

import { map as _map } from 'lodash';
import { map as rxMap } from 'rxjs/operators';
import { map as RMap } from 'ramda';
Run Code Online (Sandbox Code Playgroud)

但这很丑陋,并且掩盖了代码。我认为这是一个 hack,不是解决方案,而是由于静态分析的局限性的一种解决方法

我可以想到另一种方式:

import * as _ from 'lodash';
import { map } from 'rxjs/operators';
import * as R from 'ramda';
Run Code Online (Sandbox Code Playgroud)

然而,由于摇树的原因,JS 社区对此不以为然。但是,我认为它被夸大了只节省了 45kb

javascript node.js lodash ramda.js

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

禁用本机iOS智能横幅

我正在使用智能横幅jQuery插件来显示不同的应用程序,具体取决于用户在Android和iOS中的Web部分.

问题是Safari从该行加载原生横幅:

<meta name="apple-itunes-app" content="app-id=xxxxxxxxxx">
Run Code Online (Sandbox Code Playgroud)

所以我在Safari中展示了2个横幅.

如何禁用本机Safari横幅或使用CSS隐藏它?我尝试删除该行代码,但之后两个横幅都没有显示.

谢谢!

html css safari jquery ios

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

我应该从constructor()或ngOnInit()实例化一个Observable吗?

我知道,一般而言,无论是注入,new修改还是从构造器实例化,实例都应该在构造函数中实例化实例变量和依赖项@ngrx/store select()

@Component
export class MyCoolComponent implements OnInit {
    public coolObservable$: Observable<any>;
    public myItems$: Observable<Item[]>;

    constructor(private myCoolService: CoolService, private store: Store) {
        // Instantiate the Observables here?
        this.coolObservable$ = Observable.of('cool!');
        this.myItems$ = this.store.select('items');
    }

    public ngOnInit() {
        // Or instantiate the Observables here?
        this.coolObservable$ = Observable.of('cool!');
        this.myItems$ = this.store.select('items'); 
    }
}
Run Code Online (Sandbox Code Playgroud)

什么是最佳做法Angular

observable rxjs ngrx angular ngrx-store

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

我是否应该始终使用ChangeDetectionStrategy.OnPush

我应该始终ChangeDetectionStrategy.OnPush在组件中使用吗?

我总是听到OnPush它绝对令人惊讶,并解决了许多问题,加快了Angular应用的速度,甚至摆脱了NgZone。但是,如果是这样,为什么默认情况下不生成它ng g component

如果真是太神奇了,那我们应该一直使用它吗?

angular2-changedetection angular angular-changedetection

5
推荐指数
2
解决办法
517
查看次数

no-unused-variable TSLint 规则不适用于私有 @HostBinding

在我的 TSLint 文件中,我有:

"no-unused-variable": true
Run Code Online (Sandbox Code Playgroud)

在我的组件中,有时我有:

// tslint:disable-next-line:no-unused-variable
@HostBinding('class') private classes = 'my-theme';
Run Code Online (Sandbox Code Playgroud)

因为classes是私有的,TSLint 抱怨,所以我每次都必须禁用 TSLint。

因为封装我不想公开。@HostBinding

解决这个问题的推荐方法是什么?

encapsulation tslint angular2-hostbinding angular angular6

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

@ngrx/store createSelector() 真的有必要吗?

我真的很喜欢干净的 API this.store.select('media', 'games');

我不需要用 来创建任何选择器createSelector(),也不需要导入任何东西。我觉得当项目变大时,选择器成为了这个伟大的中间层。media.selectors.ts成为一个整体文件。

我最终让很多选择器做简单的事情,而不是:

this.store.select('media', 'games');
Run Code Online (Sandbox Code Playgroud)

我愿意:

import * as fromMedia '../media'

this.store.select(fromMedia.getAllGamesSelector());
Run Code Online (Sandbox Code Playgroud)

和同上,用于movies例如:

import * as fromMedia '../media'

this.store.select(fromMedia.getAllMoviesSelector());
Run Code Online (Sandbox Code Playgroud)

我知道createSelector()记忆化有好处,但我非常怀疑使用简单的选择strings会慢得多......

我读过的每个指南都要求您必须使用 createSelector()

所以我的问题是,什么时候使用合适createSelector()?可以使用字符串选择器,还是不赞成并且是不好的做法?

ngrx ngrx-effects angular ngrx-store ngrx-store-4.0

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