【发布时间】:2016-01-18 02:29:24
【问题描述】:
我有一个 Angular 1 应用程序,它使用一个简单的 contentEditable 指令,可以在模板中像这样使用:
<span contenteditable="true" ng-model="model.property" placeholder="Something">
编辑元素会触发$setViewValue(element.html(),它按预期工作。
我想用类似简洁的模板语法在 Angular2 中制作一些东西。理想情况下,我希望模板看起来像这样:
<span contentEditable="true" [(myProperty)]="name"></span>
其中 'name' 是组件上的一个属性,并让指令在更改时更新组件。我觉得我很接近这个(Plunker Link):
//our root app component
import {Component, Input, Output Directive, ElementRef, Renderer, OnInit} from 'angular2/core'
@Directive({
selector: '[contentEditable]',
host: {
'(blur)': 'update($event)'
}
})
export class contentEditableDirective implements OnInit {
@Input() myProperty;
constructor(private el: ElementRef, private renderer: Renderer){}
update(event){
this.myProperty = this.el.nativeElement.innerText;
}
ngOnInit(){
this.el.nativeElement.innerText = this.myProperty;
}
}
如果我传递一个像{name: "someName"} 这样的对象,这个想法是有效的,但是如果只是传递一个属性,它似乎传递的是值,而不是引用,因此绑定不会流回组件。有没有办法做到这一点,仍然允许模板语法不冗长,但仍然允许轻松重用指令。
【问题讨论】:
-
我要补充一点,如果我向指令添加 2 个输入并将对象和属性名称作为单独的输入传递,我可以做到这一点。我的模板将如下所示:
<myElement contentEditable="true" [myobject]="anobject" property="somevalue">然后我可以从指令中操作myobject[property]。不过更喜欢更清洁的方式。
标签: angular