我在尝试使用Angular *ngFor
和*ngIf
同一个元素时遇到了问题.
当尝试遍历集合中的集合时*ngFor
,集合被视为null
并因此在尝试访问模板中的属性时失败.
@Component({
selector: 'shell',
template: `
Shell
{{log(thing)}}
{{thing.name}}
`
})
export class ShellComponent implements OnInit {
public stuff:any[] = [];
public show:boolean = false;
constructor() {}
ngOnInit() {
this.stuff = [
{ name: 'abc', id: 1 },
{ name: 'huo', id: 2 },
{ name: 'bar', id: 3 },
{ name: 'foo', id: 4 },
{ name: 'thing', id: 5 },
{ name: 'other', id: 6 },
]
}
toggle() {
this.show = !this.show;
}
log(thing) {
console.log(thing);
}
}
我知道简单的解决方案是*ngIf
向上移动一个级别但是对于像a循环列表项的情况一样ul
,li
如果集合为空,我最终将为空,或者我的li
s包装在冗余容器元素中.
这个plnkr的例子.
请注意控制台错误:
EXCEPTION: TypeError: Cannot read property 'name' of null in [{{thing.name}} in ShellComponent@5:12]
我做错了什么或这是一个错误?
Angular v2不支持同一元素上的多个结构指令.
作为一种解决方法,使用
允许您为每个结构指令使用单独元素的元素,但不会将其标记为DOM.
{{log(thing)}}
{{thing.name}}
(在Angular v4之前)允许执行相同但具有不同语法的混淆且不再推荐的语法
{{log(thing)}}
{{thing.name}}
正如大家所指出的那样,即使在单个元素中有多个模板指令也能在角度1.x中工作,但在Angular 2中不允许这样做.你可以从这里找到更多信息:https://github.com/angular/angular/issues/ 7315
2016角2 beta解决方案是使用占位符,所以代码就像这样
.....
但由于某种原因,上述情况不起作用,2.0.0-rc.4
你可以使用它
更新的答案2018.....
随着更新,现在2018年角度v6建议使用
而不是
所以这是更新的答案.
.....
我还有一个解决方案.
用[hidden]
而不是 *ngIf
区别在于
*ngIf
将从DOM中删除元素,而[hidden]
实际上CSS
通过设置display:none来播放样式
4> Mark Rajcok..:正如@Zyzle所提到的,@Günter在评论中提到(https://github.com/angular/angular/issues/7315),这是不受支持的.
同
- {{log(thing)}} {{thing.name}}
列表为空时没有空元素.甚至
元素也不存在(如预期的那样).
填充列表时,没有冗余容器元素.
@Zyzle在他的评论中提到的github讨论(4792)也提出了另一个使用的解决方案
(下面我使用你的原始标记 - 使用
s):{{log(thing)}} {{thing.name}}此解决方案也不会引入任何额外/冗余容器元素.
5> Zyzle..:您不能在同一元素上使用
ngFor
和ngIf
。您可以做的是推迟填充正在使用的阵列,ngFor
直到单击示例中的切换按钮为止。这是您可以执行的基本(不太好)方法:http : //plnkr.co/edit/Pylx5HSWIZ7ahoC7wT6P
6> Alireza..:您不能
Structural Directive
在Angular中对同一个元素使用多个元素,这会造成混乱和结构混乱,因此您需要将它们应用于2个单独的嵌套元素中(或者可以使用ng-container
),请从Angular团队阅读以下声明:每个主机元素一个结构指令
总有一天,您只想在满足特定条件时才重复HTML块。您将尝试将* ngFor和* ngIf放在同一宿主元素上。Angular不会让你。您只能对一个元素应用一个结构指令。
原因是简单。结构化指令可以对宿主元素及其后代进行复杂的处理。当两个指令对同一宿主元素提出要求时,哪个优先?NgIf或NgFor应该先走?NgIf是否可以取消NgFor的效果?如果是这样(看起来应该是这样),Angular应该如何概括取消其他结构性指令的能力?
这些问题没有简单的答案。禁止多个结构性指令使它们无济于事。对于这种用例有一个简单的解决方案:将* ngIf放在包装* ngFor元素的容器元素上 。一个或两个元素都可以是ng容器,因此您不必引入额外的HTML级别。
因此,
ng-container
如果您具有类或其他某些属性,则可以使用(Angular4)作为包装器(将从dom中删除)或div或span:{{log(thing)}} {{thing.name}}推荐阅读
如何解决《如何从具有相同服务UUID的两个设备中找到特定的BLE4.0外设》经验,为你挑选了1个好方法。 ... [详细] 如何解决《我们可以在域驱动设计中使用ASP.NET标识吗?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《没有控制器后缀的控制器》经验,为你挑选了1个好方法。 ... [详细] 如何解决《在cordova3.4.0应用程序中添加外部Jar文件》经验,为你挑选了0个好方法。 ... [详细] 如何解决《如何使用fullcalendar为resourceDay视图中的所有资源列设置相同的日期》经验,为你挑选了0个好方法。 ... [详细] 如何解决《在SQLServer中加入2个表》经验,为你挑选了0个好方法。 ... [详细] 如何解决《需要澄清-PythonFor循环使用列表》经验,为你挑选了1个好方法。 ... [详细] 如何解决《NUnit中最常用的方法是在集合上断言相等的长度》经验,为你挑选了1个好方法。 ... [详细] 如何解决《如何在每个元素中使用自定义字符串设置std::vector<std::string>》经验,为你挑选了1个好方法。 ... [详细] 如何解决《无法在eclipse中访问SwipeRefreshLayout》经验,为你挑选了1个好方法。 ... [详细] 如何解决《WindowsPhone模拟器错误,Hyper-V组件未运行,WindowsAzure中托管的Windows8.1》经验,为你挑选了1个好方法。 ... [详细] 如何解决《OpenGL纹理没有显示》经验,为你挑选了0个好方法。 ... [详细] 如何解决《pandasgroupby和joinlist》经验,为你挑选了2个好方法。 ... [详细] 如何解决《Android:Adb拒绝与客户端的连接》经验,为你挑选了2个好方法。 ... [详细] 如何解决《暂停打印不能使用Java》经验,为你挑选了0个好方法。 ... [详细] 如何解决《有没有办法检测代码是在本地,测试环境还是AppEngine上运行?》经验,为你挑选了1个好方法。 ... [详细] 如何解决《Haskell-无法在无限序列中推导出(a~Integer)》经验,为你挑选了1个好方法。 ... [详细] 如何解决《键盘钩子用delphi寻找F12》经验,为你挑选了1个好方法。 ... [详细] 吐了个 "CAO" !Tags | 热门标签RankList | 热门文章
- 1以编程方式向Python函数添加“装饰器”
- 2Google搜索API.过滤许可证
- 3.NET HttpClient - 取消了CancellationToken而不取消请求
- 4拉出具有依赖关系的无形多态函数
- 5排除控制器中的实体结果
- 6在*提交之前更改一个特定提交的名称,电子邮件和/或日期
- 7C#语言规范是否明确声明比较必须是相同的类型?
- 8Embeddable Common-Lisp asdf:defsystem返回无效的相对路径名
- 9不允许使用依赖于Julia中类型定义中的整数类型参数的表达式
- 10在共享索引上加入Pandas Dataframes
- 11我的代码输出异常
- 12在AOSP上设置默认应用程序
- 13从python生成器接收'return'值的最佳方法
- 14使用.NET的ANSI着色控制台输出
- 15有人可以帮我在java中翻译这行代码吗?
- 16迭代器begin()应该包含3,输出说2?
- 17以固定的可拖动div为中心
- 18Oracle中日志记录/ nologging选项的用途是什么
- 19Swift:如何在一组特定字符后获取所有内容
- 20大约每分钟运行一次任务而不使用Thread.Sleep
DevBox开发工具箱 | 专业的在线开发工具网站 京公网安备 11010802040832号 | 京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有