Aurelia:访问Custom Element的自定义函数或自定义属性

时间:2015-07-05 17:33:09

标签: javascript custom-attributes aurelia custom-element

我正在玩Aurelia中的自定义元素功能,并试图创建一个进度条'元件。

进展-bar.js

import {customElement, bindable} from 'aurelia-framework';
@customElement('progress-bar')
export class ProgressBar
{
//do stuff//
}

进展-一个bar.html

<template>
  <link rel="stylesheet" type="text/css" href="src/components/progress-bar.css">
  <div class='progress-bar' tabindex=0 ref="bar">bloo</div>
</template>

test.html(相关部分)

  <require from="./components/progress-bar"></require>
  <progress-bar ref="pb">a</progress-bar>

所有这一切都很好。但是我在如何获取主页面上苦苦挣扎可以调用某个函数或者更改元素上的某些属性,这应该在进度条本身上做一些事情。

我尝试创建一个功能&#39; doSomething&#39;在progress-bar.js中,但我无法在test.js中访问它。

已添加到progress-bar.js

doSomething(percent, value) {
  $(this.bar).animate('width: ${percent}%', speed);
}

在test.js里面

clicked() {
   console.log(this.pb); // this returns the progress bar element fine
   console.log(this.pb.doSomething); //this returns as undefined
   this.pb.doSomething(percent, value); // this fails outright with error: typeError - doSomething is not a function
}

接下来,我尝试在progress-bar元素中设置自定义属性,并可能使用valueChange来改变div。

Inside progress-bar.js

@bindable percent=null;
@bindable speed=null;

test.js

clicked() {
this.pb.percent=50; //this updated fine
this.pb.speed=1500; //this updated fine

}

那里没问题,几乎就在那里。 但是,如何在属性更改时设置要调用的处理程序?

我找到了一个有这种语法的教程:

@bindable({
  name:'myProperty', //name of the property on the class
  attribute:'my-property', //name of the attribute in HTML
  changeHandler:'myPropertyChanged', //name of the method to invoke on property changes
  defaultBindingMode: ONE_WAY, //default binding mode used with the .bind command
  defaultValue: undefined //default value of the property, if not bound or set in HTML
})

但我似乎无法在progress-bar.js中使用该代码。 添加后,页面无法正常呈现.Gulp似乎没有返回任何错误消息,但浏览器控制台返回此错误:

ERROR [app-router] Router navigation failed, and no previous location could be restored.

当我在网页上的某处出现语法错误时,通常会收到的消息。

我不确定这里有很多事情:

这是自定义元素的正确用途吗? 我们可以创建其中包含函数的自定义元素吗? 我们可以创建具有自定义属性的自定义元素,然后可以在其值发生变化时触发事件吗?

不发布整个代码的道歉,因为我在尝试不同的事情时有很多变化。

3 个答案:

答案 0 :(得分:16)

使用Aurelia,您可以在组件中使用此约定:yourpropertynameChanged()

import {customElement, bindable, inject} from 'aurelia-framework';
import $ from 'jquery';

@customElement('progress-bar')
@inject(Element) 
export class ProgressBar
{
    @bindable percent;
    @bindable speed;

    constructor(element){
        this.element = element;
    }

    percentChanged(){
        doSomething(this.percent, this.speed);
    }

    speedChanged(){
        doSomething(this.percent, this.speed);
    }

    doSomething(percent, value) {
        $(this.element).animate('width: ${percent}%', value);
    }
}

您不需要从外部访问doSomething() 但您只需要更改属性:

<progress-bar percent="${pb.percent}" speed="${pb.speed}">a</progress-bar>

答案 1 :(得分:4)

我采用了更简单的 lazier方法并使用http://pointclouds.org/documentation/tutorials/iterative_closest_point.php,您可以使用nprogress.set(0.4),但我使用默认的&#34;正在发生的事情&#34;行为。

import nprogress from 'nprogress';
import {bindable, noView} from 'aurelia-framework';

@noView
export class LoadingIndicator {
  @bindable loading = false;

  loadingChanged(newValue){
    newValue ?
      nprogress.start() :
      nprogress.done();
  }
}

答案 2 :(得分:0)

首先将一些对象绑定到自定义元素,例如“config”:

<custom-element config.bind="elementConfig"></custom-element>

然后在你的页面js文件中:

someFunction(){ this.elementConfig.elementFunction(); }

并在自定义元素中添加如下函数:

@bindable({ name: 'config', attribute: 'config', defaultBindingMode: bindingMode.twoWay });
export class JbGrid {
    attached() {
        this.config.elementFunction = e=> this.calculateSizes();
    }
    calculateSizes() {
    //your function you want to call
    }
}

现在您可以在函数中访问自定义元素“this”。