我想设置<ng-content>
动态实例化组件的主体ComponentFactoryResolver
.
我看到我可以使用输入和输出访问ComponentRef
,但不能设置<ng-content>
.
请注意<ng-content>
我计划设置可以包含简单文本/可以跨越动态创建的组件
@Component({
selector: 'app-component-to-project',
template: `<ng-content></ng-content>`
})
export class ComponentToProject implements AfterContentInit {
ngAfterContentInit() {
// We will do something important with content here
}
}
@Directive({
selector: 'appProjectionMarker'
})
export class ProjectionMarkerDirective implements OnInit {
constructor(private viewContainerRef: ViewContainerRef, private componentFactoryResolver: ComponentFactoryResolver) {
}
ngOnInit() {
const componentFactory: ComponentFactory<ComponentToProject> = this.componentFactoryResolver.resolveComponentFactory(ComponentToProject);
const componentRef: ComponentRef<ComponentToProject> = this.viewContainerRef.createComponent(componentFactory);
// Question: How to set content before the child's afterContentInit is invoked …
Run Code Online (Sandbox Code Playgroud) 我有一个javascript文件,在带有<article>
标记的每个元素上设置一个'click'的EventListener .我希望在事件触发时获得点击文章的ID.出于某种原因,我的代码什么都没有!
我的javascript:
articles = document.getElementsByTagName('article');
articles.addEventListener('click',redirect(e),false);
function redirect(e){
alert(e.target.id);
}
Run Code Online (Sandbox Code Playgroud)
为什么这不起作用?BTW我的文章设置是在窗口加载时调用的函数,我知道这是有效的,因为该函数有其他功能.
编辑
所以我修复了我的代码,所以它将循环并将监听器添加到每个文章元素,现在我得到一个没有任何内容的警报框.当尝试输出没有ID的e.target时,我会为每个元素获得以下消息:
[object HTMLHeadingElement]
Run Code Online (Sandbox Code Playgroud)
有什么建议?
另一个编辑
我目前的javascript代码:
function doFirst(){
articles = document.getElementsByTagName('article');
for (var i = 0; i < articles.length; i++) {
articles[i].addEventListener('click',redirect(articles[i]),false);
}
}
function redirect(e){
alert(e.id);
}
window.addEventListener('load',doFirst,false);
Run Code Online (Sandbox Code Playgroud)
这是在页面完成加载时显示我的警告框,而没有考虑到我没有点击该死的东西:O
我有一个功能分支,有很多提交.
A---B---C master
\
\-B'---C'---D'...---Z' feature
Run Code Online (Sandbox Code Playgroud)
我正在努力,feature
但另一个开发人员创建了提交B
和C
.现在我想feature
在提交时重新定义C
,但是我和/或automerge在rebase期间引入了错误.我的项目具有非常好的测试覆盖率,我可以使用控制台运行测试ant rebuild test
,现在我希望git告诉我哪个提交是第一次破坏我的测试的提交,所以我可以修复该提交.我怎样才能做到这一点?
我正在努力将用户输入的数据国际化到一个相当大的客户端/服务器(HTTP(Hessian)用于通信)应用程序中,该应用程序存储在数据库中.用户可以选择他们想要查看的语言,并且在没有所请求语言的翻译时使用默认语言.
目前,数据类可能如下所示:
class MyDataClass {
private Long id;
private String someText;
/* getters and setters */
}
Run Code Online (Sandbox Code Playgroud)
国际化后,它可能如下所示:
class MyDataClass {
private Long id;
private Set<LocalizedStrings> localizedStrings;
/* getters and setters */
}
class LocalizedStrings {
private Locale locale;
private String someText;
/* getters and setters */
}
Run Code Online (Sandbox Code Playgroud)
当然,在MyDataClass中创建一个委托getter可能会很有趣,它负责以正确的语言环境获取文本:
public String getSomeText(Locale locale) {
for(LocalizedString localized : localizedStrings) {
if (localized.getLocale().equals(locale)) {
return localized.getSomeText();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的团队中,虽然需要一直传递语言环境直到它们到达数据类,但仍然存在一些问题.由于所有这些事情都发生在服务器上,并且每个对服务器的请求都是在专用线程中处理的,因此有人建议将请求的区域设置存储在ThreadLocal对象中并创建向后兼容的无参数getter:
public String getSomeText() {
return getSomeText(myThreadLocalLocale.get());
}
Run Code Online (Sandbox Code Playgroud)
然后ThreadLocal需要是一个全局变量(静态的某个地方),或者需要在每个单独的实例创建时注入MyDataClass(我们使用spring,所以如果我们对数据类进行Spring管理,我们可以注入它(感觉错误)我)).
对于我来说,使用ThreadLocal对于语言环境感觉不对.我可以模糊地说,我不喜欢getter中的隐形魔法和全局变量的依赖(在数据类中!).然而,对此有一种"不好的感觉"并不是与同事争论它的好方法.为了帮助我需要以下其中一个答案:
众所周知,泛型类型在编译过程中无法存在.他们被类演员取代.
但是,类型信息存在于类文件中,可以使用反射查看:
public class Demo
{
private List<String> list;
public Demo() throws SecurityException, NoSuchFieldException
{
System.out.println(((Class<?>)((ParameterizedType) getClass().getDeclaredField("list").getGenericType()).getActualTypeArguments()[0]).getName());
}
public static void main(String[] args) throws SecurityException, NoSuchFieldException
{
new Demo();
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,将打印java.lang.String
.
JIT可以将它用于某种优化吗?或者从JIT的角度来看这些信息是无用的?
Thymeleaf非常强调"自然模板",这意味着所有模板都是有效的XHTML文件.我一直认为这是向前迈出的一大步,我可以在我的模板中生成片段,例如在我写的JSP中
<tagfile:layout title="MyPageTitle">
<jsp:body>
Main content goes here
</jsp:body>
</tagfile:layout>
Run Code Online (Sandbox Code Playgroud)
我的"布局"-Tagfile包含所有标题标签(标题,样式表链接......),菜单和justs在正确的位置插入标题文本和正文.在设计我的html fragement时,我不需要了解样式表菜单等.
这与Thymeleaf的想法形成对比,Thymeleaf鼓励我创建完整的html页面(包括示例菜单和所有标题).虽然Thymeleaf的手册继续强调这是多么伟大,但它从不处理代码重复问题:
我误解了那里的东西吗?或者这确实是一种权衡吗?如何最大限度地减少代码重复的影响?
我的Web应用程序有一堆"普通"资源(html页面等)以及一些REST资源,这些资源是由前面提到的html页面从JavaScript调用的.
如果存在会话超时,则用户将被重定向到登录表单.这对于"普通"资源来说非常好,但对于REST资源则不然.我只需要403响应,以便JavaScript可以接管并要求用户重新进行身份验证.
网上有无数的例子如何配置每一个,但我找不到一个如何组合方法的例子.我的所有API网址都以"/ api /"开头,因此我需要所有这些网址的403以及所有剩余网址的重定向.我该如何设置?
我成功配置了spring-security-oauth2,以便外部应用程序可以使用我的应用程序进行身份验证.但是,基于外部应用程序并基于用户允许的内容,客户端只能访问我的API的一部分.可用子集由OAuth Scopes确定.
在经典的Spring应用程序中,我可以使用@PreAuthorize来强制基于角色的边界:
@Controller
public class MyController {
@PreAuthorize("hasRole('admin')")
@RequestMapping("...")
public String doStuff() {
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
使用OAuth和Scopes而不是角色时,我该怎么做?
在SaaS应用程序中,我有一些模板用于生成通知电子邮件或某些HTML页面.到目前为止,我还没有使用百日咳,到目前为止所有模板都是硬编码的,但我很乐意改变它,以便应用程序的用户可以自己编辑这些模板.问题是,如果我允许用户自己编辑模板,用户可能会调用任何Java方法,这将完全损害系统安全性.
百万美元可以"沙盒化"还是可以禁用在用户编辑模板环境中危险的所有功能?(为了执行,模板只接收带有getter和setter或java.util.Map的POJO,因此在模型上调用方法不是问题)
最明显的问题是OGNL/SpringEL.这些表达的力量可能很大,但它们也非常危险.我只需要从模型中调用getter.所以我试着像这样实现我自己的表达式解析器(以下只是一些快速和脏的概念证明,它不是"完成"):
final TemplateEngine templateEngine = new TemplateEngine();
final StandardDialect dialect = new StandardDialect();
dialect.setExpressionParser(new IStandardExpressionParser() {
@Override
public IStandardExpression parseExpression(final IExpressionContext context, final String input) {
if (!input.startsWith("${") || !input.endsWith("}")) {
throw new IllegalArgumentException("Only variable expressions allowed, not " + input);
}
final String[] path = StringUtils.split(input.substring("${".length(), input.length() - "}".length()), '.');
return new IStandardExpression() {
@Override
public String getStringRepresentation() {
return "Variable " + Arrays.toString(path);
}
@Override
public Object execute(final IExpressionContext context) {
Object result = context.getVariable(path[0]); …
Run Code Online (Sandbox Code Playgroud) 下面是angularjs的最小示例示例,保存为angular.html
:
<!DOCTYPE html>
<html lang="en" xmlns:ng="http://angularjs.org" ng:app="">
<head>
<title>My HTML File</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js"></script>
</head>
<body>
<p>Nothing here {{'yet' + '!'}}</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
但是我坚信XML,我喜欢创建符合XML标准的所有html文档.我尝试调整示例并将其保存为angular.xhtml
:
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:ng="http://angularjs.org" ng:app="">
<head>
<title>My HTML File</title>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js" />
</head>
<body>
<p>Nothing here {{'yet' + '!'}}</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
最大的变化是xhtml-Namespace和文件扩展名".xhtml".没有任何错误或任何错误.只是页面显示为好像没有角度.
如何让angularjs使用符合XML的文件?
java ×3
thymeleaf ×2
angular ×1
angularjs ×1
git ×1
html5 ×1
javascript ×1
jit ×1
onclick ×1
optimization ×1
rebase ×1
spring ×1
thread-local ×1