【问题标题】:Aurelia <compose> model.bind what triggers a change event?Aurelia <compose> model.bind 是什么触发了 change 事件?
【发布时间】:2016-04-26 00:52:48
【问题描述】:

在 Aurelia 中,我们能够使用 &lt;compose&gt; 元素动态组合视图模型和视图。我们还可以通过model.bind 提供一个数据对象,然后可以通过提供的视图模型的activate 方法访问该对象。

我的问题是,什么条件会触发提供的模型数据的更改事件?如果我更改了我提供的对象的属性,我的activate 方法会将此对象作为第一个参数看到更改吗?还是需要替换整个对象才能触发更改?

【问题讨论】:

  • 我写了一个例子,做了一些测试,每次都反映了变化。也许你应该提供一些代码和你的确切用例,这样更容易帮助你
  • 问题是这不适用于任何现有的应用程序或代码。出于文档目的,这个问题更高级。 Aurelia 中的绑定系统、观察到的内容、观察方式和时间是框架的未知组件之一。 Aurelia 文档几乎没有解释什么时候发生这样的事情。因为我现在没有用例,所以我没有代码。所以如果一个对象的属性在你的测试中改变了,这个值就更新了吗?也许它是通过引用传递的?
  • 数组以推送、弹出等方法更新,如本答案stackoverflow.com/questions/36394399/… 中所述。属性在其值更改时更新。 activate 方法在视图被激活之前被调用一次

标签: aurelia


【解决方案1】:

当模型绑定到视图模型时,activate(model) 会被调用一次。当模型属性发生变化时,这些变化将反映在组合视图模型中,因为模型是参考,而不是副本。

例如,假设我有一个视图/视图模型,它是如下路线的目标(这个例子不是一个完全干净的例子,因为我也在尝试其他东西,但它应该足够清楚):

视图:此视图创建由&lt;hr&gt; 分隔的两个部分。顶部仅显示每个视图的model.message。底部为每个视图创建一个&lt;compose&gt;

<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 位于全局范围内。这样,如果我们离开路线然后返回路线,对view.model 所做的任何更改都将保留。如果模型位于 ZenStudio 对象上,则当路线移开并返回此视图时,该对象将被销毁并重新创建,因此会丢失数据。

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和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 视图显示的model.messageEditorView 相同。当用户在&lt;input&gt; 中编辑消息的值时,这些值会在顶级视图以及相应的&lt;compose&gt; 视图中正确更改。

虽然我没有示例,但如果您在openViews 列表中添加了另一个项目,那么这将在显示新消息的顶级视图中添加另一个子视图和另一行。 repeat.for 监听列表中的加法和减法并正确创建/删除组合元素。

希望能回答你的问题。

【讨论】:

  • 托尼解释得很好。确实,确实回答了我的问题,然后回答了更多问题。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
相关资源
最近更新 更多