相关疑难解决方法(0)

带有用户单击所选组件的Angular动态选项卡

我正在尝试设置一个标签系统,允许组件自己注册(带标题).第一个选项卡就像一个收件箱,有大量的操作/链接项可供用户选择,每个点击都应该能够在点击时实例化一个新组件.动作/链接来自JSON.

然后,实例化的组件将自己注册为新选项卡.

我不确定这是否是"最佳"方法?Sofar我见过的唯一指南是静态标签,这没有帮助.

到目前为止,我只有主要引导的标签服务在整个应用程序中持续存在,看起来像这样的东西.

export interface ITab { title: string; }

@Injectable()
export class TabsService {
    private tabs = new Set<ITab>();

    addTab(title: string): ITab {
        let tab: ITab = { title };
        this.tabs.add(tab);
        return tab;
    }

    removeTab(tab: ITab) {
        this.tabs.delete(tab);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 如何在收件箱中创建一个动态列表来创建新的(不同的)标签?我有点猜测DynamicComponentBuilder会被使用吗?
  2. 如何从收件箱创建的组件(单击时)将自己注册为选项卡并显示?我猜ng-content,但我找不到有关如何使用它的更多信息

编辑:尝试澄清

将收件箱视为邮件收件箱,将项目作为JSON提取并显示多个项目.单击其中一个项目后,将创建一个新选项卡,其中包含该项操作"类型".然后类型是一个组件

Edit2:图片

http://i.imgur.com/yzfMOXJ.png

angular-template angular

214
推荐指数
3
解决办法
13万
查看次数

如何使用/创建动态模板来使用Angular 2.0编译动态组件?

我想动态创建模板.这应该用于ComponentType运行时构建一个并在托管组件内部放置(甚至替换)它.

直到我使用RC4 ComponentResolver,但RC5我收到消息:

ComponentResolver不推荐用于动态编译.使用ComponentFactoryResolver连同@NgModule/@Component.entryComponents或ANALYZE_FOR_ENTRY_COMPONENTS提供商,而不是.对于仅运行时编译,您也可以使用Compiler.compileComponentSync/Async.

我发现了这个(官方的angular2)文件

Angular 2同步动态组件创建

并了解我可以使用其中之一

  • 一种动态的ngIfComponentFactoryResolver.如果我将已知组件传递到托管内部@Component({entryComponents: [comp1, comp2], ...})- 我可以使用.resolveComponentFactory(componentToRender);
  • 真正的运行时编译,带Compiler...

但问题是如何使用它Compiler?上面的注释说我应该打电话:Compiler.compileComponentSync/Async- 那怎么样?

例如.我想为一种设置创建(基于一些配置条件)这种模板

<form>
   <string-editor
     [propertyName]="'code'"
     [entity]="entity"
   ></string-editor>
   <string-editor
     [propertyName]="'description'"
     [entity]="entity"
   ></string-editor>
   ...
Run Code Online (Sandbox Code Playgroud)

在另一种情况下这个(string-editor被替换text-editor)

<form>
   <text-editor
     [propertyName]="'code'"
     [entity]="entity"
   ></text-editor>
   ...
Run Code Online (Sandbox Code Playgroud)

等等(editors属性类型的不同数量/日期/引用,跳过一些用户的某些属性......).即这是一个例子,真正的配置可以生成更多不同和复杂的模板.

该 …

compilation typescript angular2-compiler angular

185
推荐指数
10
解决办法
13万
查看次数

如何在Angular2中绑定原始html

我使用Angular 2.0.0-beta.0,我想直接创建和绑定一些简单的HTML.是可能的,怎么样?

我试着用

{{myField}}
Run Code Online (Sandbox Code Playgroud)

但myField中的文本将被转义.

对于Angular 1.xi发现了ng-bind-html的命中,但这似乎不支持2.x.

弗兰克

angular

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

在angular2中动态加载HTML模板

我创建了一个angular-cli包含AppComponent的项目,如下所示:

import { Component } from '@angular/core';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';
}
Run Code Online (Sandbox Code Playgroud)

app.component.html一样

<h1>
  Good Morning, {{title}}
</h1>
Run Code Online (Sandbox Code Playgroud)

因此,当我使用ng build它生成它时会生成一些像这样的文件./dist/main.bundle.js,其中包含一些代码,如下所示 -

/* 586 */
/***/ function(module, exports) {

module.exports = "<h1>\n  Good Morning, {{title}}\n</h1>\n"

/***/ },
/* 587 */
Run Code Online (Sandbox Code Playgroud)

这意味着,在构建时,编译器/ bundle-er正在读取html文件并将它们连接到生成的js文件中.

但在我的情况下,html也是动态的,内容驱动的是服务器端.可以说,我的模板文件不是html,而是app.component.jsp,并且完全驻留在一些不同的服务器或文件夹上.

此JSP文件有时会返回<h1>Good Morning, {{title}}</h1> ,有时还<h1>Good Afternoon, {{title}}</h1>取决于当前的服务器时间.

如何实现这一功能?

我的理解是,我需要定义某种加载器函数说: loadDynamicTemplate(template_url) …

typescript aem angular-cli angular2-compiler angular

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

清理Angular2中的输入

我试图从我的数据库中获取第三方(可能不安全)的html内容并将其插入到我的html文档中.

我如何安全地做到这一点(针对XSS的保护)?

Angular1.x中曾经有过$sce消毒输入,我如何在Angular2中做到这一点?据我了解,Angular2默认自动清理它,这是正确的吗?

这样的东西不起作用:

<div class="foo">
    {{someBoundValueWithSafeHTML}} // I want HTML from db here
</div>
Run Code Online (Sandbox Code Playgroud)

sanitize typescript angular

25
推荐指数
1
解决办法
3万
查看次数

Angular 2有条件地添加属性指令

我在这里看到两个问题如何有条件地添加和删除项目上的属性(是否可以使用Angular2有条件地显示元素属性?)但我的问题是,是否可以添加和删除属性指令?我能够添加和删除属性,但Angular不会将该属性"编译"为属性指令,但该属性只是在那里无所事事.以下是2个标签的示例:

第一个是我试图有条件地应用属性指令而第二个有所有时间.

这是gif: 在此输入图像描述

以下是我应用属性的方法(可能有不同的方法来应用属性指令?)

<h1 [attr.colored]="check ? '': null">Testing something</h1>
Run Code Online (Sandbox Code Playgroud)

这是指令:

import {Directive, ElementRef} from '@angular/core'
@Directive({
    selector: '[colored]',
    host: {
        '(mouseenter)': 'onMouseEnter()',
        '(mouseleave)': 'onMouseLeave()'
    }
})

export class colorDirective {
    constructor(private el: ElementRef) {
    }
    onMouseEnter() { this.highlight("yellow"); }
    onMouseLeave() { this.highlight(null); }

    private highlight(color: string) {
        this.el.nativeElement.style.backgroundColor = color;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:有几个答案,但它们适用于AngularJS(1)

javascript angular

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

Zone.assertZonePatched不是函数

我收到错误消息:

未处理的Promise拒绝:Zone.assertZonePatched不是函数

虽然我在index.html中正确导入zonejs:

  <script src="https://unpkg.com/zone.js@0.6.17/dist/zone.js"></script>
Run Code Online (Sandbox Code Playgroud)

这是代码:

Plnkr:http://plnkr.co/edit/zZYOcgxcRINx23JhuxOk?p =preview

这有什么不对?

zonejs angular

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

在ngFor中动态添加组件

我有一个"仪表板",可以加载已配置的元素.仪表板模板具有以下内容:

  <div class="dash-container" [ngGrid]="gridConfig">
    <div *ngFor="let box of boxes; let i = index"
       [(ngGridItem)]="box.config"
       (onItemChange)="updateItem(i, $event)"
       (onResize)="onResize(i, $event)"
       (onDrag)="onDrag(i, $event)"
       (onDragStop)="onDragStop(i,$event)"
       [ngClass]="box.class"
     >
      <div class="handle"><h4>{{box.title}}</h4></div>
      <div [innerHTML]= "box.content"></div>
    </div>
  </div>
Run Code Online (Sandbox Code Playgroud)

现在<div [innerHTML]= "box.content"></div>不行,因为非标准元素被消毒了.运行最新的Angular 2.4.6(RC 6).

我看一下我能找到的动态组件的例子 - 但我看到的只是他们只是将组件添加到当前组件 - 但我需要它们在一个非常特定的div中,如上例所示.

ComponentFactoryResolver通常与...一起使用@ViewChild.但我不能在一个循环中这样做:

ngAfterViewInit() {
    const dashWidgetsConf = this.widgetConfigs();
    for (var i = 0; i < dashWidgetsConf.length; i++) {
      const conf = dashWidgetsConf[i];

      @ViewChild(conf.id, {read: ViewContainerRef}) var widgetTarget: ViewContainerRef;

      var widgetComponent = this.componentFactoryResolver.resolveComponentFactory(UnitsComponent);
      widgetTarget.createComponent(widgetComponent);
    }
  }
Run Code Online (Sandbox Code Playgroud)

@viewchild给'装饰者在这里无效'.如何从conf列表中加载组件(在循环中)并将它们添加到组件中的特定div(divs …

angular

17
推荐指数
2
解决办法
9649
查看次数

使用gridstack和angular2动态添加组件?Jquery $ .parseHTML不起作用

我有以下jsfiddle

我希望能够将我的自定义组件粘贴到特定的网格中(例如"")

现在没有Angular2,我只是使用:

var el = $.parseHTML("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><div/>");
this.grid.add_widget(el, 0, 0, 6, 5, true);
Run Code Online (Sandbox Code Playgroud)

问题是,我不知道我怎么能这样做:

var el = $.parseAndCompileHTMLWithComponent("<div><div class=\"grid-stack-item-content\" data-id=\""+id+"\"/><fancy-button></fancy-button><div/>");
this.grid.add_widget(el, 0, 0, 6, 5, true);
Run Code Online (Sandbox Code Playgroud)

在angular1中,我知道有一个编译,但在angular2中,没有这样的东西.

我的花哨按钮组件很简单,如下所示:

@Component({
  selector: 'fancy-button',
  template: `<button>clickme</button>`
})
export class FancyButton {}
Run Code Online (Sandbox Code Playgroud)

如何动态添加花式按钮组件?

gridstack angular

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

如何在没有ngFor且没有其他@Component的情况下多次重复一段HTML

问题很简单,我想在我的模板中多次重复一段HTML.

但是我希望它在我的页面中的不同位置重复,这意味着ngFor不是解决方案,因为这些片段会一个接一个地直接重复.

一个"工作解决方案"是为我重复的HTML定义一个特定的@Component,并执行类似的操作: <p>Whatever html</p><my-repeated-html></my-repeated-html><h4>Whatever</h4><my-repeated-html></my-repeated-html>

但是我觉得创建一个专用组件来做类似的事情有点过分,它没有任何功能意义,只有我想设置的html结构才需要.

在ng2模板引擎中是否真的没有允许定义"内部模板"并在当前模板中的任何需要的地方使用它?

如果答案是否定的,我想我宁愿复制HTML,即使有点糟糕.

angular

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