是否可以创建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 ...如果我想要更多房间怎么办?现在感觉就像这样的痛苦
我正在尝试升级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)
以下是问题的简化版本,只需极少的复制步骤: …
我已经阅读了有关Angular的路由器过渡动画的这篇文章:
和:
但是,这太静止了.我希望它左右滑动,并根据标签的顺序正确.
是否可以为此创建路由器动画?我的意思是下面的例子:
https://material.angular.io/components/tabs/examples
看看它是如何载玻片BOTH左和右很自然地取决于你是什么标签.
这必须是动态的,因为选项卡将在运行时添加.
有人可以向我解释为什么.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) 我的文件夹中有大约 10 个应用程序/apps。
s的选择器是否应该@Component带有前缀app-?
例如app-root,
或者应该全部以应用程序名称作为前缀?
例如,如果调用我的应用程序之一,那么我将有一个名为?FooBar的组件。fb-root另一个项目称为HelloWorld,然后我将有一个名为hw-root
我似乎找不到如何在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)
我真的想实现心跳,以便客户端知道谁连接并发送一些数据以保持客户端和服务器同步.
我需要手动操作吗?
如何一个导入map或merge或从多个进口任何其他功能?
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。
我正在使用智能横幅jQuery插件来显示不同的应用程序,具体取决于用户在Android和iOS中的Web部分.
问题是Safari从该行加载原生横幅:
<meta name="apple-itunes-app" content="app-id=xxxxxxxxxx">
Run Code Online (Sandbox Code Playgroud)
所以我在Safari中展示了2个横幅.
如何禁用本机Safari横幅或使用CSS隐藏它?我尝试删除该行代码,但之后两个横幅都没有显示.
谢谢!
我知道,一般而言,无论是注入,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?
我应该始终ChangeDetectionStrategy.OnPush在组件中使用吗?
我总是听到OnPush它绝对令人惊讶,并解决了许多问题,加快了Angular应用的速度,甚至摆脱了NgZone。但是,如果是这样,为什么默认情况下不生成它ng g component?
如果真是太神奇了,那我们应该一直使用它吗?
在我的 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
解决这个问题的推荐方法是什么?
我真的很喜欢干净的 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()?可以使用字符串选择器,还是不赞成并且是不好的做法?