小编jme*_*zel的帖子

自定义元素中“嵌套”数据更新的 Aurelia 绑定钩子

当绑定对象中发生更新时,我想得到通知。这个 plunk http://plnkr.co/edit/7thr0V演示了我的问题。

更详细地说:我通过 bind [data.bind] 将对象“数据”传递到自定义元素中。如果我现在更新数据中的一个属性,我希望自定义元素中的“dataChanged”钩子被调用。如果我在自定义元素模板中显示绑定数据对象的属性,它会更新,因此绑定本身可以正常工作。

我的第二个责备是使用 ObserverLocator,但它也不会触发嵌套更新。

app.js 中的对象:

this.data = {
  nested: {
    content: "Hello nested world!"
  }
};
Run Code Online (Sandbox Code Playgroud)

自定义元素ce的绑定:

<require from="ce"></require>
<ce data.bind="data"></ce>
Run Code Online (Sandbox Code Playgroud)

ce.js 部分:

@bindable data;

constructor(observerLocator) {
  this.observerLocator = observerLocator;

  var subscription = this.observerLocator
        .getObserver(this, 'data')
        //.getObserver(this, 'data["nested"]["content"]') //Doesn't work
        //.getObserver(this, 'data.nested.content') //Doesn't work
        .subscribe(this.onChangeData);
}

onChangeData(newData, oldData) {
  console.log('data changed from ', oldData, newData);
}

dataChanged(d) {
    console.log("Changed", d);
}
Run Code Online (Sandbox Code Playgroud)

ce模板部分:

${data.nested.content}
Run Code Online (Sandbox Code Playgroud)

在 app.js 中,我以 2 个间隔更新数据对象。第一个间隔每秒编辑一个“嵌套”属性。每五秒的第二个间隔将数据对象设置为新的。在第二个间隔,钩子和观察者被调用,但我想知道,当第一个间隔发生任何变化时。

setInterval(() => {
  this.data.nested.content += …
Run Code Online (Sandbox Code Playgroud)

javascript binding aurelia

4
推荐指数
1
解决办法
2210
查看次数

使用可绑定和依赖项测试aurelia customElement

我使用Aurelia的1.0.0-beta.1并尝试编写一些单元测试.

我有这样的customElement:

...
@inject(BindingEngine, Class1, Class2)
export class MyElement{

@bindable data;

constructor (bindingEngine, class1, class2) {
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

我想创建一个可测试的MyElement实例,其中包含Class1和Class2的Mocks以及可绑定字段数据.

到目前为止,我发现的是,由于此处描述的 API更改,使用BehaviorInstance的示例不再有效.

在查看aurelia-templating测试之后,我的方法现在看起来像这样:

import {TemplatingEngine} from 'aurelia-templating';
import {Container} from 'aurelia-dependency-injection';
import {BindingEngine} from 'aurelia-binding';

import { Class1Mock, Class2Mock } from './myMocks';

describe('The MyElement customElement', () => {
    let container;
    let bindingEngine;
    let templateEngine;

    let myElement;

    beforeEach(() => {
        container = new Container();

        //Add my mocks to DI container?
        container.registerInstance('Class1', new Class1Mock());
        container.registerInstance('Class2', new Class2Mock()); …
Run Code Online (Sandbox Code Playgroud)

unit-testing bindable custom-element aurelia

3
推荐指数
1
解决办法
597
查看次数