2013-05-30 10 views
32

私は、ディレクティブの親コントローラからスコープを継承する必要があります。私は必ずスコープから離れることを望んでいません:偽です。また、私は必ずしも独立したスコープを使用する必要はありません。なぜなら、私が気にしている値を得るためには、多くの作業が必要になるからです。スコープ付きの角度ディレクティブから親スコープを更新することは可能ですか:true?

親スコープを更新する場合は、私の指示にscope:trueを使用することは意味がありますか?

<div ng-controller="MyCtrl"> 
     Hello, {{name}}! 
     <my-directive></my-directive> 
</div> 
var myApp = angular.module('myApp',[]); 

//myApp.directive('myDirective', function() {}); 
//myApp.factory('myService', function() {}); 

function MyCtrl($scope) { 
    $scope.name = 'Dave'; 
} 


myApp.directive('myDirective', function() { 
    return { 
     scope: true, 
     restrict: 'EA', 
     link: function(scope, elem, attrs) { 
      scope.updateName = function(newName) { 
       console.log('newName is: ' + newName); 
       scope.name = newName; 
      } 
     }, 
     template: '<input ng-model="updatedName" placeholder="new name value"> <button ng-click="updateName(updatedName)">Update</button>' 
    } 
}) 

fiddle

答えて

49

@ user1737909はすでにSOの質問を参照して(What are the nuances of scope prototypal/prototypical inheritance in AngularJS?、これは問題を説明し、それを修正するためのさまざまな方法を推奨していますが)、SOで答えを出そうとします。

フィーリングがうまくいかない理由は、プリミティブ型(つまり、文字列、数値、またはブール型)が書き込まれたときです。たとえば、scope.name = newName - 「書き込み」は常にローカルスコープ/オブジェクト。つまり、子スコープは、同じ名前の親プロパティをシャドウする独自のnameプロパティを取得します。この問題を解決するには、親スコープにプリミティブ型ではなくオブジェクトを使用する方法があります。子スコープは、そのオブジェクトへの参照を取得します。オブジェクトプロパティへの書き込みは、親オブジェクトか子オブジェクトかに関係なく、そのオブジェクトに行われます。 (子スコープは、独自のオブジェクトを取得しません。)

$scope.obj = {name: 'Dave'}; 

を次に、あなたの指示に:

​​

とHTML:あなたの内

Hello, {{obj.name}}! 

fiddle

+0

この部分だけを理解し、どのようにスコープをより一般的に機能させるかはわかりません。 – Ven

+0

これは私が探していたものです。これはそれを(またはその大部分を)一緒に糊付けしたものです。ありがとう、詳細な答えを記入してください、これは本当に素晴らしいです。 – binarygiant

+1

古いスレッドを残念に思っていますが、マテリアル・アングルでは、たとえば gpothier

15

スコープ継承は子の値が親の値を設定している設定を意味していませんチェックしてみてください。

子スコープでscope.name = newNameを実行する代わりに、親スコープにメソッドを追加します。親スコープではなく親スコープでメソッドを追加し、このメソッドを継承するため、子スコープからメソッドを呼び出します。

+0

これは私が行ったことですが、親スコープのプロパティへの直接アクセスを許可するよりもセッターメソッドを提供する方がきれいだったようです。 – Gruffy

6

親に書き込むリンク関数スコープ(グローバルな "$ scope"スコープ)so:scope。$ parent.name = newName;

関連する問題