2016-11-29 6 views
1

この時点で手伝ってください。角度1.5のコンポーネントチェック '&binding'がnullです

私は「結合&」を使用して、角度1.5コンポーネントを持っている:

app.component('foo', { 
    bindings: { 
     message: '<' 
     onSomething: '&' 
    }, 
    template:'<div>blah blah</div>', 
    controller: function() { 
     var ctrl = this; 
     ctrl.myOperation = function() { 
      ctrl.onSomething(); // <= look this! 
     } 
    } 
}); 

そして私は「onSomething」は定義されているかどうかをテストしたいと思います。私はこのようにそれを使用する場合

は実際には、:

<foo message='my message' on-something='doSomething()'></foo> 

すべてがOKです。

しかし、私はこの方法でそれを使用する場合:

<foo message='my message'></foo> 

は「onSomething」を定義するべきではありませんが、私はそれをチェックすることはできませんよ!

私が試した:

if (ctrl.onSomething) ... 
if (ctrl.onSomething == undefined) ... 
if (ctrl.onSomething == null) ... 
if (angular.isDefined(ctrl.onSomething) 

をすべてこれらのテストは常にコールバックが渡されていない場合であっても、「真」を返します。

+0

'「&」' 'へ「&!」'、その後、あなたは 'ctrl.onSomethingが表示されます=== null'なので – abyx

答えて

2

ctrl.onSomethingは、コンポーネントのインスタンスで宣言されたコールバックを開始するため、trueを返します。常に真実になります。代わりにコントローラに$attrsを注入し、ヌルチェックしてみてください。誰かが速すぎて技術を研究したときにこれが起こる

function($attrs){ 
    var ctrl = this; 
    ctrl.myOperation = function(){ 
     if($attrs.onSomething){ .... } 
    } 
} 
あなたが変更される可能性がかなり確信して
+1

:I $ attrを知らなかった。ありがとうございました! –

+1

それには微妙な違いがあります。ほとんどの場合、コントローラーの追加方法と時期は、指示と構成要素です。コンポーネント内でリンク関数を取得していないので、ディレクティブのリンク関数と同じ機能を実現するために、注入するコンポーネントに$ elementおよび$ attrsサービスを追加しました。 – jusopi

関連する問題