- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
仍在继续我的 Angular2(测试版 1)新手之旅,我试图了解如何正确实现双向绑定(bind),而不会让我的应用程序陷入无限循环。
请在这个 Plunker 找到示例重现:http://plnkr.co/edit/83NeiUCEpPvYvUXIkl0g .只需运行并单击按钮即可。
我的场景:
text
属性和一个 textChanged
事件。我的问题是,每当编辑器组件以编程方式设置其 xml
属性时,这会触发底层 Ace 编辑器中的更改,进而触发 text-changed 事件,该事件又由编辑器组件的回调,等等。这会产生无限循环,您可以看到编辑器的文本闪烁。我在这里做错了什么?
指令代码如下:
import {Component,Directive,EventEmitter,ElementRef} from 'angular2/core';
declare var ace: any;
@Directive({
selector: "ace-editor",
inputs: [
"text"
],
outputs: [
"textChanged"
]
})
export class AceDirective {
private editor : any;
public textChanged: EventEmitter<string>;
set text(s: string) {
if (s === undefined) return;
let sOld = this.editor.getValue();
if (sOld === s) return;
this.editor.setValue(s);
this.editor.clearSelection();
this.editor.focus();
}
get text() {
return this.editor.getValue();
}
constructor(elementRef: ElementRef) {
var dir = this;
this.textChanged = new EventEmitter<string>();
let el = elementRef.nativeElement;
this.editor = ace.edit(el);
let session = this.editor.getSession();
session.setMode("ace/mode/xml");
session.setUseWrapMode(true);
this.editor.on("change", (e) => {
let s = dir.editor.getValue();
dir.textChanged.next(s);
});
}
}
这是编辑器组件:
import {Component,EventEmitter} from "angular2/core";
import {AceDirective} from "./ace.directive";
@Component({
selector: "my-editor",
directives: [AceDirective],
template: `<div style="border:1px solid red">
<ace-editor id="editor" [text]="xml" (textChanged)="onXmlChanged($event)"></ace-editor>
</div>
<div><button (click)="changeXml()">set xml</button></div>`,
inputs: [
"xml"
]
})
export class EditorComponent {
private _xml: string;
// using a property here so that I can set a breakpoint
public set xml(s: string) {
this._xml = s;
}
public get xml() : string {
return this._xml;
}
constructor() {
this._xml = "";
}
public onXmlChanged(xml: string) {
this._xml = xml;
}
// an action which somehow changes the XML content
public changeXml() {
this._xml = "<x>abc</x>";
}
}
最佳答案
只需执行 [(ngModel)]="property"语法。尽管它看起来像旧的双向绑定(bind)实际上正在将其分解为两种不同的单向绑定(bind),一种用于输入,一种用于输出,但 Angular 2 处理更改的方式和他在引擎盖下的脏检查循环是什么改变了,不会让你做一个无限循环。
关于typescript - Angular 2 : how to properly implement 2-way databinding without incurring in endless loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34793538/
我正在尝试在 android 中学习 ViewModel,在我的第一阶段学习中,我正在尝试使用 ViewModel 和 DataBinding 来更新 UI(TextView)。在 ViewModel
在 ASP.NET 中,您可以单独绑定(bind)控件(即 GridView1.DataBind() ),也可以调用 Page.DataBind()绑定(bind)页面上的所有控件。 这两个调用之间有
如何使用新的 dataBinder 插件进行双向绑定(bind)(从 UI 到数据以及从数据到 UI)? 非常感谢! 最佳答案 我们还没有这个,也许在 v1 之后。不确定您的用例是什么,但我们已经为每
我正在尝试将 Kotlin 与 DataBinding 一起使用,但我遇到了这个错误: Error:[kapt] An exception occurred: java.lang.annotation
我只是将我的项目转换为 androidX 并成功构建项目。但是当我想运行那个时间时,它在启用了 java 的 android studio 3.5.3 中创建了这个错误。 这是我的项目 gradle:
这个问题在这里已经有了答案: no cached version available for offline mode (11 个回答) 2年前关闭。 无法确定任务的依赖关系 :app:compile
这是一个与今天无关的老问题。请参阅 Android 开发人员的说明。与四年前相比,现在将数据绑定(bind)应用于您的项目要容易得多。 我正在阅读 https://developer.android.
异常(exception)情况如下: java.lang.NullPointerException: Attempt to read from field 'java.lang.Runnable an
构建项目时收到以下警告 DSL element 'android.dataBinding.enabled' is obsolete and has been replaced with 'androi
今天升级Android Studio 2.3后,构建项目失败。 当构建项目 gradle console 显示这个错误: FAILURE: Build failed with an exception
我有一个消息列表,我将这些消息的模板绑定(bind)到单击事件中,然后在该模板内,我有一个超链接绑定(bind)到 js 函数,该函数应该打开一个 mailto 页面。 但是,尽管 js 函数执行,但
我在 Wildfly 8.2.1 和 Glassfish 4.1 中使用 Spring Data JPA 部署 Spring MVC 应用程序时遇到问题(它在 Wildfly 10 中工作,但我不允许
我为横向创建了一个替代布局 XML 文件。使用 DataBindingUtil 的填充在纵向模式下工作正常,但在加载自定义 XML 文件时在横向模式下崩溃。 使用数据绑定(bind)的布局膨胀: cl
数据绑定(bind)到控件的可见属性时是否存在任何已知问题? 无论我的属性是什么,该控件始终不可见。 Public ReadOnly Property IsRibbonCategory() As Bo
使用数据绑定(bind),如何绑定(bind)使用值类型的新对象? 简单的例子: public class Person() { private string _firstName;
我有一个 Image 控件,它的源绑定(bind)到对象上的属性(字符串 url 到图像)。进行服务调用后,我使用新 URL 更新数据对象。在调用 PropertyChanged 事件后,它离开我的代
我想在传入的绑定(bind)整数上添加一个常量值。事实上,我有几个地方想要绑定(bind)到相同的源值但添加不同的常量。所以理想的解决方案是这样的...... (注意:这是一个展示这个想法的例子
我正在开发一个 Windows Phone 应用程序。我将 List 绑定(bind)到内容控制元素。 在转换器中,我返回指定参数的字符串。
天哪!我讨厌这个。为什么这么复杂? 我正在尝试做的事情: 我有一个包含多个用户控件的表单,每个控件都有一个数据网格。每个网格通过 .ItemSource 属性与 ObservableCollectio
我正在使用数据绑定(bind)并且我已经声明了 lateinit var对于绑定(bind)以及当我要去不同的 fragment Leaky canary 显示泄漏时。 fragment class
我是一名优秀的程序员,十分优秀!