2017-03-25 9 views
6

私はAureliaカスタムエレメントを構築していますが、特別なバインディングビヘイビアを使用したいのですが、私はカスタムエレメントクラスの外で(宣言して)使用できないようです。また、バインディングビヘイビアやその他のカスタムメイドのためにAureliaにネームスペースが存在するかどうかは疑問でした。Aureliaカスタム要素とそれ自身の名前空間にバインディング動作を追加する方法は?

ここで私は

オプション-binding.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';のカスタム要素内に直接試行されましたが、すべての場合において、このバインディングが見つからないと言っています。

他のコード/プロジェクトによってグローバルに宣言される可能性があるカスタムバインドビヘイビアとの名前の衝突を避けるために、これを独自のネームスペース(可能な場合)にする方法も知りたいと思います。

EDIT

私はrequireと結合挙動をインポートする@janmvtrinidadの提案を試みたが、私はViewModelににそれをインポートしようとしたときに前に持っていたように私は、同様の結果を得ることができます。また、私のすべてのファイルは同じディレクトリにあるので、./を使用すれば十分です。これまでのところ、カスタム要素と同じファイルの中でバインディング動作を宣言することに固執しています。これはこれまでのところ唯一の方法です。カスタム要素ビュー(テンプレート)の内部

<template> 
    <require from="./optional-binding"></require> 
    ... 

私はそれは私も解放それ

Cannot find module './aurelia-bootstrap-select/optional-binding' 

コード全体/プロジェクト

を見つけることができないというエラーが出ますあなたはコード全体を見たい場合は、このプラグインをコミュニティにいくつか前に、プラグインはAurelia-Bootstrap-Selectとして利用可能です。現在、誰かがそれを使いたいとしていて、またOptionalBindingBehaviorを持っているなら、名前の衝突が起こるでしょう、それは酷いことです。

NOTE私は懸賞金を計上した後も

、私はまだアウレリアで名前の衝突を避けるために、名前空間を扱う正しい方法をお待ちしております。

+0

こんにちは@ghiscoding私はViewEngineコードで、どのようにaureliaがdependecyで動作するかを調べています。すべてのテンプレートは独自のviewResourcesを持っているように見えるので、テンプレートにテンプレートが必要なときに機能し、リソースを使用するときにはより高い順序を持つはずです。また、あなたと一緒に働くのと同じシナリオを試してみました。 – janmvtrinidad

+0

@janmvtrinidad私と他の人を助ける有効な答えを見てうれしいです。私はあなたの答えを受け入れることがうれしいです。 – ghiscoding

答えて

0

コード構造が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ずにグローバルリソースを使用することができます。

名前空間に関して、Aureliaは、同じClassNameで2つのリソースをグローバルに登録しようとするとエラーをスローします。この状況では、2つのオプションがあります。

  • @CustomElement@CustomAttributeデコレータを使用して、既存の規則を上書きすることができます。デフォルトの規約では、ClassNameがInitCapsからdash-caseに変換されると想定されます。詳細情報here
  • また、明示的にrequireあなたのhtmlでそれをすることができます。それはglobalResourcesをオーバーライドし、あなたのカスタムリソースをあなたのhtmlの中で使っています.GlobalResourceでもあなたのカスタムバインドビヘイビア/リソースと同じClassNameを持っています。

EDIT

私も他のコードでグローバルに宣言される可能性がありますカスタムバインディングの行動との衝突を付けないようにする(可能ならば)それ自身の名前空間にこれを作る方法を知っていただきたいと思います

/プロジェクト。

現在のところ不可能です。 Aurelia viewResourcesはシングルトンです。私が信じるように、上記の第2の箇条書きに記載されているように、requireを使用してhtmlに追加すれば十分です。

+0

返事ありがとうございますが、私が誤解しない限り、これは私の主な質問に答えていないようです。グローバルにしたくない場合は、カスタム要素の名前空間が存在する場合のみ、カスタム要素でその名前空間を使用できるようにしたいと考えています。そして、私は既にglobalResourcesを試してみましたが、それはカスタム要素ではうまくいきませんでした。私のカスタム要素はコミュニティが利用できるプラグインなので、命名の衝突を避けることを好みます。この時点で私は衝突しました。私はそれを実際に見ました – ghiscoding

+0

viewResources内のすべてのbindingBehaviorsがシングルトンです。ですから、あなたのhtmlをincludeするか、 'viewResources' [decorator](https://github.com/aurelia/templating/blob/master/src/decorators.js#L268)を使います。 – janmvtrinidad

+0

プラグイン/機能に関しては、Rob [ここ](https://github.com/aurelia/framework/issues/427#issuecomment-221284897)のコメントとして現在利用できません。 – janmvtrinidad

関連する問題