Aurelia <compose> model.bind 什么触发了变化事件?
Aurelia <compose> model.bind what triggers a change event?
在 Aurelia 中,我们可以使用 <compose>
元素动态组合视图模型和视图。我们还可以通过 model.bind
提供数据对象,然后可以通过提供的视图模型的 activate
方法访问该数据对象。
我的问题是,什么条件会触发所提供模型数据的更改事件?如果我在我提供的对象上更改 属性,我的 activate
获取此对象作为第一个参数的方法是否会看到更改?或者是否需要替换整个对象才能触发更改?
当模型绑定到视图模型时,activate(model)
被调用一次。当模型属性更改时,这些更改将反映在组合视图模型中,因为模型是引用,而不是副本。
例如,假设我有一个视图/视图模型,它是路由的目标,如下所示(这个例子不是一个完全干净的例子,因为我也在试验其他东西,但它应该足够清楚):
视图:此视图创建由 <hr>
分隔的两个部分。顶部仅显示每个视图的 model.message
。底部为每个视图创建一个 <compose>
。
<template>
<div repeat.for="view of openViews">
<p>${view.model.message}</p>
</div>
<hr>
<div repeat.for="view of openViews">
<compose view-model.bind="$parent.getViewFromType(view)" model.bind="view.model">
</compose>
</div>
</template>
查看模型:请注意,openViews
是在全局范围内。这样一来,如果我们离开路线然后 return 导航到路线,对 view.model
所做的任何更改都将保留。如果模型位于 ZenStudio
对象上,则当路线移开并 return 到此视图时对象将被销毁并重新创建,因此会丢失数据。
var openViews = [
{ viewType: "", model: { message: "View 1"}},
{ viewType: "", model: { message: "View 2"}},
{ viewType: "", model: { message: "View 3"}}
];
export class ZenStudio {
constructor() {
}
created() {
}
get openViews() {
return openViews;
}
getViewFromType(view) {
// TOOD Load plugins and use the views defined by plugins
return "./views/editor-view";
}
}
editor-view视图和view-model如下:
<template>
<h1>${model.message}</h1>
<form>
<input type="text" value.bind="model.message">
</form>
</template>
视图模型:
export class EditorView {
constructor() {
}
created(owningView, thisView) {
this.view = thisView;
this.parentView = owningView;
}
activate(model) {
// Keep track of this model
this.model = model;
}
}
您会看到 ZenStudio
视图显示与 EditorView
相同的 model.message
。当用户在 <input>
中编辑消息的值时,顶级视图以及相应的 <compose>
视图中的值会正确更改。
虽然我没有示例,但如果您将另一个项目添加到 openViews
列表中,则会添加另一个子视图和顶层视图中显示新消息的另一行。 repeat.for
侦听对列表所做的添加和减法,并正确地创建/删除组合元素。
希望这能回答您的问题。
在 Aurelia 中,我们可以使用 <compose>
元素动态组合视图模型和视图。我们还可以通过 model.bind
提供数据对象,然后可以通过提供的视图模型的 activate
方法访问该数据对象。
我的问题是,什么条件会触发所提供模型数据的更改事件?如果我在我提供的对象上更改 属性,我的 activate
获取此对象作为第一个参数的方法是否会看到更改?或者是否需要替换整个对象才能触发更改?
当模型绑定到视图模型时,activate(model)
被调用一次。当模型属性更改时,这些更改将反映在组合视图模型中,因为模型是引用,而不是副本。
例如,假设我有一个视图/视图模型,它是路由的目标,如下所示(这个例子不是一个完全干净的例子,因为我也在试验其他东西,但它应该足够清楚):
视图:此视图创建由 <hr>
分隔的两个部分。顶部仅显示每个视图的 model.message
。底部为每个视图创建一个 <compose>
。
<template>
<div repeat.for="view of openViews">
<p>${view.model.message}</p>
</div>
<hr>
<div repeat.for="view of openViews">
<compose view-model.bind="$parent.getViewFromType(view)" model.bind="view.model">
</compose>
</div>
</template>
查看模型:请注意,openViews
是在全局范围内。这样一来,如果我们离开路线然后 return 导航到路线,对 view.model
所做的任何更改都将保留。如果模型位于 ZenStudio
对象上,则当路线移开并 return 到此视图时对象将被销毁并重新创建,因此会丢失数据。
var openViews = [
{ viewType: "", model: { message: "View 1"}},
{ viewType: "", model: { message: "View 2"}},
{ viewType: "", model: { message: "View 3"}}
];
export class ZenStudio {
constructor() {
}
created() {
}
get openViews() {
return openViews;
}
getViewFromType(view) {
// TOOD Load plugins and use the views defined by plugins
return "./views/editor-view";
}
}
editor-view视图和view-model如下:
<template>
<h1>${model.message}</h1>
<form>
<input type="text" value.bind="model.message">
</form>
</template>
视图模型:
export class EditorView {
constructor() {
}
created(owningView, thisView) {
this.view = thisView;
this.parentView = owningView;
}
activate(model) {
// Keep track of this model
this.model = model;
}
}
您会看到 ZenStudio
视图显示与 EditorView
相同的 model.message
。当用户在 <input>
中编辑消息的值时,顶级视图以及相应的 <compose>
视图中的值会正确更改。
虽然我没有示例,但如果您将另一个项目添加到 openViews
列表中,则会添加另一个子视图和顶层视图中显示新消息的另一行。 repeat.for
侦听对列表所做的添加和减法,并正确地创建/删除组合元素。
希望这能回答您的问题。