【发布时间】:2017-08-18 04:04:46
【问题描述】:
我正在构建一个 Aurelia 自定义元素并且我想使用一个特殊的绑定行为,但是我似乎无法在我的自定义元素类之外使用它(声明它)。另外,我想知道 Aurelia 中是否存在用于绑定行为和其他自定义内容的命名空间?
这是我要使用的绑定行为
可选绑定.js - code provided by another stack question
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 中的名称冲突。
【问题讨论】:
-
嗨@ghiscoding 我正在查看 ViewEngine 代码,了解 aurelia 如何与依赖项一起工作。似乎每个模板都有自己的 viewResources,因此当您在模板中需要它们时它应该可以工作,并且在使用资源时它会具有更高的顺序。并且还尝试了您使用的相同场景,并且它适用于我的情况。
-
@janmvtrinidad 我很高兴看到一个有效的答案,这可以帮助我和其他人。如果可行,我很乐意接受您的回答。
标签: javascript ecmascript-6 aurelia