[英]Aurelia how to add Binding Behavior in a Custom Element and within its own namespace?
我正在构建一个Aurelia自定义元素,我想使用一个特殊的绑定行为,但我似乎无法在我的自定义元素类之外使用它(声明它)。 另外,我想知道Aurelia中是否存在绑定行为和其他自定义内容的命名空间?
这是我想要使用的绑定行为
optional-binding.js - 由另一个堆栈问题提供的代码
export class OptionalBindingBehavior {
bind(binding, scope, interceptor) {
binding.originalupdateTarget = binding.updateTarget;
binding.originalTargetProperty = binding.targetProperty;
binding.updateTarget = val => {
if (val === undefined || val === null || val === '') {
binding.targetProperty = null;
} else {
binding.targetProperty = binding.originalTargetProperty;
}
binding.originalupdateTarget(val);
};
}
unbind(binding, scope) {
binding.updateTarget = binding.originalupdateTarget;
binding.originalupdateTarget = null;
binding.targetProperty = binding.originalTargetProperty;
binding.originalTargetProperty = null;
}
}
我试着用这种方式导入
index.js
import {MyCustomElement} from './my-element';
import './optional-binding.js';
export function configure(aurelia) {
aurelia.globalResources('./my-element');
}
export {
MyCustomElement
};
并尝试import './optional-binding.js';
直接在自定义元素内,但在所有情况下,它一直说它找不到这个绑定。
我还想知道如何将它放入它自己的命名空间(如果可能的话),以避免命名与可能由其他代码/项目全局声明的自定义绑定行为的冲突。
编辑
我尝试使用@janmvtrinidad的建议来导入带有require
的绑定行为,但是我在尝试在ViewModel中导入它时获得了类似的结果。 另请注意,我的所有文件都在同一目录中,因此使用./
应该足够了。 到目前为止,我一直在声明与自定义元素相同的文件中的绑定行为,这是它到目前为止唯一的工作方式。
自定义元素视图(模板)内
<template>
<require from="./optional-binding"></require>
...
我得到了它无法找到的错误
Cannot find module './aurelia-bootstrap-select/optional-binding'
整个守则/项目
我也在不久前向社区发布了这个插件,如果你想查看整个代码,插件可以作为Aurelia-Bootstrap-Select使用 。 目前,如果有人想要使用它并且还有一个OptionalBindingBehavior
则会发生名称冲突,这是一个无赖。
注意
即使我发布了赏金之后,我仍在等待处理命名空间的正确方法,以避免Aurelia中的名称冲突。
假设您的代码结构由Aurelia CLI
生成,其中元素,绑定行为等位于resources
文件夹中。 现在,您可以将绑定行为和自定义元素添加为globalResources 。 在您的resources/index.ts
,在config.globalResources([...])
添加绑定行为路径。
export function configure(config: FrameworkConfiguration) {
config.globalResources([
'./value-converters/json',
'./binding-behaviors/intercept-one',
'./elements/pagination'
]);
}
现在,您可以在html中全局使用资源而require
使用。
在命名空间方面,当您尝试使用相同的ClassName注册全局两个资源时,Aurelia会抛出错误。 在这种情况下运行时有两种选择。
@CustomElement
和@CustomAttribute
装饰器来覆盖现有约定。 默认约定将假定您的ClassName将从InitCaps
转换为dash-case
。 更多信息在这里 。 require
它。 它将覆盖globalResources然后在html中使用您的自定义资源,即使globalResource与您的自定义绑定行为/资源具有相同的ClassName。 编辑
我还想知道如何将它放入它自己的命名空间(如果可能的话),以避免命名与可能由其他代码/项目全局声明的自定义绑定行为的冲突。
目前这是不可能的。 Aurelia viewResources
是一个单身人士。 我相信,您可以使用上面第二个子弹中所述的require
将其添加到您的html上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.