2013-08-02 16 views
28

私は、いくつかのブール値属性を指令にバインド/設定したいと思います。しかし、私は本当にこれを行う方法と次の動作を達成するためには分かりません。角度ディレクティブでブール値をバインドする方法は?

フラグを構造体に設定したいとします。リストが折りたたみ可能であるかどうかを考えてみましょう。私は、次のHTMLコードを持っている:

<list items="list.items" name="My list" collapsable="true"></list> 

itemsがバインドさ双方向ですが、nameは、私はどちらかの値を渡すことによって、そのcollapsable属性がリストの$スコープで利用できるようにしたいだけの属性

です(真、偽または何でも)、私はいくつかのUIコンポーネントを開発していると私は彼らとの対話の複数の方法を提供したいと思い

<list items="list.items" name="{{list.name}}" collapsable="list.collapsed"></list> 

結合のいずれか2ウェイ。たぶん、時間の中には、オブジェクトのプロパティを属性に渡すことによって、そのコンポーネントの状態(折りたたまれているかどうか)を知りたい人もいます。

これを達成する方法はありますか?もし私が何かを忘れてしまったり、間違っていたら私を修正してください。

おかげ

+1

をスコープの値を別のスコープの値に設定することができないため、 '' = ''でバインドされた変数は、直接ブール値' true'または 'false'を渡すときには機能しません。例えば'$ scope.collapsable = false;' –

+0

実行時に折りたたみ可能な属性値の変更を行いますか、値が変更されない場合は除外時に同じままにします –

+0

attrs ["collapsable"] –

答えて

8

は結合双方向の設定ディレクティブのスコープを作成します。

app.controller('ctrl', function($scope) 
{ 
    $scope.list = { 
     name: 'Test', 
     collapsed: true, 
     items: [1, 2, 3] 
    }; 
}); 

app.directive('list', function() 
{ 
    return { 
     restrict: 'E', 
     scope: { 
      collapsed: '=', 
      name: '=', 
      items: '=' 
     }, 
     template: 
      '<div>' + 
       '{{name}} collapsed: {{collapsed}}' + 
       '<div ng-show="!collapsed">' + 
        '<div ng-repeat="item in items">Item {{item}}</div>' + 
       '</div>' + 
       '<br><input type="button" ng-click="collapsed = !collapsed" value="Inside Toggle">' + 
      '</div>' 
    }; 
}); 

は、次に属性としてのオプションを渡す:

<list items="list.items" name="list.name" collapsed="list.collapsed"></list> 

http://jsfiddle.net/aaGhd/3/

+2

間違いなく、これは機能します!しかし、 'true'や' false'を使って 'collapsed'属性をブール値で設定できるようにしたいと思います。 –

+0

' collapsed = "true" ' – AlexFoxGill

+0

collapsed =" true "この指令のために働いています。 – hutingung

5

文字列を渡すことはできませんtrueまたはfalseを属性値として使用し、双方向バインディングの属性値としてlist.collapsedなどのスコーププロパティを渡すこともサポートしています。あなたはどちらか一方の方法を選ぶ必要があります。

これは、分離スコープを使用する場合、ディレクティブ内の属性の値を解釈する方法を1つしか指定できないためです。

私はあなたがあなたのdiretiveで=を使用し、またattrs.collapsabletrueまたはfalseに設定されている場合は、あなたのリンク機能でチェックすることができたとします、二を使用し、もしそうなら、あなたはブール値が渡された知っているし、そうでない場合双方向データバインディング。しかし、これはハッキーです。

2

私はこれについて1年遅れていることは知っていますが、実際にはリンク機能(https://docs.angularjs.org/guide/directive)を使用してこれを行うことができます。署名は次のようになります。

function link(scope, element, attrs) { ... } 

attrsにオブジェクトが渡された生の値を記入されることをあなたが言うことができそうだとすれば(attrs.collapsed ==「真」){...}またはそのようないくつかの。

+1

これはうまくいかないでしょう。属性内の値はすべてstring型です。したがって、collapsed = "false"を設定する場合は、文字列 "false"が真実であるため、true(true)となるかどうかを確認してください。 –

+0

確かに。簡単な「真の」文字列テストでサンプルを更新しました。私はそれが質問の意図に対処していると思います。 –

24

あなたはこのようなブール値のために、独自の1ウェイデータバインディングの動作を設定することができます

link: function(scope, element, attrs) { 

    attrs.$observe('collapsable', function() { 

     scope.collapsable = scope.$eval(attrs.collabsable); 
    }); 

} 

$ここで観察する使用すると、あなたが「見て」のみ変更する属性の影響を受けているとあれば影響されないことを意味しますディレクティブの$ scope.collapsableを直接変更する必要がありました。。角1.3 attrsにあるため

+1

ここでは、$ scope/$ element/$ attrsの名前を混乱させることがあります。したがって、scope、element、attrsはより適切です。 – user1338062

+0

'scope。$ eval()'とjavascriptのネイティブ 'eval()'関数に違いはありますか? – Bloke

+1

@Blokeここにあなたが役に立つと思うかもしれない質問があります。 http://stackoverflow.com/questions/15671471/angular-js-how-does-eval-work-and-why-is-it-different-from-vanilla-eval – bingles

2

$観察するには、未定義の属性についても、トリガーのようですので、あなたは、未定義の属性を考慮してほしい場合は、あなたのような何かをする必要があります:2ウェイなどの属性を設定

link: function(scope, element, attrs) { 
    attrs.$observe('collapsable', function() { 
     scope.collapsable = scope.$eval(attrs.collapsable); 
     if (scope.collapsable === undefined) { 
     delete scope.collapsable; 
     } 
    }); 
    }, 
関連する問題