2013-05-11 18 views
17

ディレクティブで補間値を設定するにはどうすればよいですか?私は次のコードから正しい値を読むことができますが、私はそれを設定することができませんでした。角度指令に補間値を設定する方法は?

JS:

app.directive('ngMyDirective', function() { 
    return function(scope, element, attrs) { 
     console.log(scope.$eval(attrs.ngMyDirective)); 

     //set the interpolated attrs.ngMyDirective value somehow!!! 
    } 
}); 

HTML:myscopevalueは私のコントローラの範囲で値をある

<div ng-my-directive="myscopevalue"></div> 

答えて

24

あなたがスコープに値を設定したいが、(事前の)プロパティの名前がわからない場合、あなたはobject[property]構文を使用することができます:文字列場合

scope[attrs.myNgDirective] = 'newValue'; 

を属性にドットが含まれている場合(例:myObject.myProperty)、これは機能しません。

// like calling "myscopevalue = 'newValue'" 
scope.$eval(attrs.myNgDirective + " = 'newValue'"); 

[更新:あなたは本当に$parseの代わり$evalを使用する必要がありますが割り当てを行うために$evalを使用することができます。あなたはどこの更新プログラムを自動的ディレクティブ内scope.colorに割り当てる、this Angular/jQuery color picker JSFiddle exampleにこの例を見ることができます

app.directive('ngMyDirective', function() { 
    return { 
     scope: { 
      theValue: '=ngMyDirective' 
     }, 
     link: function(scope, element, attrs) { 
      // will automatically change parent scope value 
      // associated by the variable name given to `attrs.ngMyDirective` 
      scope.theValue = 'newValue'; 
     } 
    } 
}); 

:あなたは分離株のスコープを使用している場合、あなたは=アノテーションを使用することができますMark's answer]

を参照してください。変数はをコントローラのスコープの指示文に渡しました。

+0

スコープ[attrs.myNgDirective] = 'newValue';働いた! myNgDirectiveの値は、スコープのサブオブジェクトではなく、スコープに直接指定する必要があります。これは意味があります – Anton

+0

私はあなたがオブジェクト表記の代入式を使って '$ eval'できなければならないと信じています。私は私の答えを更新します。 –

+0

それはクールだ。スコープのようなもの$ eval(attrs.ngMyDirective = '新しい値')? – Anton

45

ディレクティブが分離スコープを使用せず、属性を使用してスコーププロパティを指定し、そのプロパティの値を変更する場合は、$parseを使用することをお勧めします。 (私は構文は$ evalの年代よりもよりよいと思います。)属性は、ドットが含まれているかどうかを

app.directive('ngMyDirective', function ($parse) { 
    return function(scope, element, attrs) { 
     var model = $parse(attrs.ngMyDirective); 
     console.log(model(scope)); 
     model.assign(scope,'Anton'); 
     console.log(model(scope)); 
    } 
}); 

fiddle

$parse作品。

+0

興味深いもの。答えに感謝します。構文解析がevalよりも優れた用語/構文であるかもしれないという点があるかもしれません。cheers – Anton

+3

これは間違いなくスコープ分離なしで '='を実装する正しい方法です。 –

+0

ビューに反映されたmyディレクティブの変更を行うために、 'model.assign(...)'の後に 'scope。$ apply()'を追加する必要がありました。クリーナーソリューションはありますか? – Juljan