组件中的 Aurelia 自定义组件

标签 aurelia

我有一个名为选择器的基本组件

<template>
    <span> this is common for all selectors </span>
      <div>
        <content>
        </content
      </div>
</template>

import {transient} from "aurelia-framework"; 

@transient() 
export class Selector { 
  constructor(){ 
    console.log("selector called"); 
  } 
}

我有 SelectorBase 类

@transient() 

export class SelectorBase { 
    @bindable({ name: 'myProp', defaultBindingMode: bindingMode.twoWay }) myProp = null;
    constructor() { 
      console.log("selector base called"); 
    } 
}

和 2 个派生组件,称为 SelectorA 和 SelectorB。这是一个例子

<template>
  <div>
    This is selector A
  </div>
</template>

import {SelectorBase} from "./selectorBase"; 
import { transient} from "aurelia-framework";

@transient() 
export class SelectorA extends SelectorBase{ 
  constructor() { 
    super(); 
    console.log("selector A called"); 
  } 
}

我对选择器 B 也有同样的看法。

我不是从 Selector 派生的,而是从 SelectorBase 派生的。所以我的 SelectorA 和 SelectorB 组件嵌入在 Selector 组件中

我在我的观点中这样使用它

<require from="./../../selector"></require>
<require from="./../../selectorA"></require>

<selector>
  <selector-a></selector-a>
</selector>

当我打开我的第一个具有 selectorA 的 View 时这有效(正在调用 SelectorBase 和 SelectorA 构造函数),但是当我打开另一个具有选择器 B 的 View 时内容部分不显示(仅来自基本选择器的 html)。 调用了 SelectorBase 构造函数,但未调用 SelectorB 构造函数

我必须提到,当我导航回我的第一个 View 时,一切正常(按预期调用 SelectorBase 和 SelectorA 构造函数)

我找不到我做错了什么。

编辑 我认为我在 SelectorBase 上的可绑定(bind)属性导致了这个问题。不知道为什么。

谢谢

最佳答案

为了回答我自己的问题, 因为我怀疑问题是我在基类中的可绑定(bind)属性。 我从 SelectorBase 类中删除了可绑定(bind)属性,并创建了一个装饰器来创建通用可绑定(bind)属性,并将该装饰器添加到派生类中。

import {BindableProperty, HtmlBehaviorResource} from 'aurelia-templating';
import {metadata} from 'aurelia-metadata';
import {bindingMode} from 'aurelia-binding';


export function generateSelectorBindables(): any {
    return function (target: Function, key: string, descriptor: any) : void {
        // get or create the HtmlBehaviorResource
        // on which we're going to create the BindableProperty's

        let behaviorResource = <HtmlBehaviorResource>metadata.getOrCreateOwn(metadata.resource, HtmlBehaviorResource, target, key);

        let myProp = new BindableProperty({ name: 'myBindableProperty', defaultBindingMode: bindingMode.twoWay });
        myProp .registerWith(target, behaviorResource, descriptor);

        };
}

我正在像这样在我的派生选择器中使用它

import {generateSelectorBindables} from "./generateSelectorBindables";

@autoinject
@transient()
@generateSelectorBindables()
export class SelectorA extends SelectorBase {

关于组件中的 Aurelia 自定义组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35828611/

相关文章:

javascript - 在 Aurelia 中刷新详细信息页面会导致空白

aurelia - 无法使用 Aurelia 插件

node.js - Visual Studio 2017,任务运行程序资源管理器未加载模块

aurelia - aurelia 应用程序中的范围

javascript - 在 Aurelia 中无需注入(inject)即可对类对象使用验证

javascript - 如何使用 Aurelia 的 DI 容器注入(inject)工厂函数?

javascript - Aureliaview 中的脚本不起作用

Aurelia @bindable *更改初始化调用

jestjs - 为什么装饰器不能在 Jest with Babel 中工作?

jquery - 基于 Aurelia 中的表达式将所选属性添加到选项