2013-08-31 12 views
24

私は、分離スコープとngModelディレクティブを使用するディレクティブを作成しようとしています。孤立スコープとngモデルのディレクティブ

問題:
モデルがディレクティブで更新されると、呼び出し元の値が更新されません。

HTML:

<test-ng-model ng-model="model" name="myel"></test-ng-model> 

が指令:

app.directive(
    'testNgModel', [ 
    '$timeout', 
    '$log', 

function ($timeout, $log) { 

    function link($scope, $element, attrs, ctrl) { 
     var counter1 = 0, counter2 = 0; 

     ctrl.$render = function() { 
      $element.find('.result').text(JSON.stringify(ctrl.$viewValue)) 
     } 

     $element.find('.one').click(function() { 
      if ($scope.$$phase) return; 
      $scope.$apply(function() { 
       var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; 
       form.counter1 = ++counter1; 
       ctrl.$setViewValue(form); 
      }); 
     }); 
     $element.find('.two').click(function() { 
      if ($scope.$$phase) return; 
      $scope.$apply(function() { 
       var form = angular.isObject(ctrl.$viewValue) ? ctrl.$viewValue : {}; 
       form.counter2 = ++counter2; 
       ctrl.$setViewValue(form); 
      }); 
     }); 

     $scope.$watch(attrs.ngModel, function (current, old) { 
      ctrl.$render() 
     }, true) 
    } 

    return { 
     require: 'ngModel', 
     restrict: 'E', 
     link: link, 
     //if isolated scope is not set it is working fine 
     scope: true, 
     template: '<div><input type="button" class="one" value="One"/><input type="button" class="two" value="Two"/><span class="result"></span></div>', 
     replace: true 
    }; 

}]); 

デモ:fiddle

+1

'スコープ:true'には、分離株のスコープを作成しません、それは、prototypically親スコープから継承する新しい子スコープを作成し、したがって、 '$ parent.model'の理由が働きます。 (分離スコープは 'scope:{...} '構文を使用するときに作成されます。ここでは新しい子スコープも作成されますが、プロトタイプ的に継承しません)。他のディレクティブ(つまり、ng-model)とやり取りする必要のあるコンポーネントを作成しているので、ng-modelで使用されます。だから、私はあなたの2番目の、働く、バイブルと一緒に行くことをお勧めします。 –

+0

@MarkRajcokは、ディレクティブがより複雑で親スコープの汚染につながるカスタム属性をスコープに追加するので、私にとってはオプションではありません。 –

+0

'scope:true'を使用しますが、プリミティブではありません: '' [フィドル](http://jsfiddle.net/mrajcok/6ZaB5/)。 –

答えて

12

、一般的にNG-モデルと子スコープ(scope: trueまたはscope: { ... })を使用することは推奨されません。ただし、Arunは追加のスコーププロパティを作成する必要があるため、scope: trueはプリミティブではなくオブジェクトで使用できます。これはプロトタイプ継承を活用し、そう$parentがneeedされていません。

<test-ng-model ng-model="someObj.model" ...> 

fiddle

+0

新しいスコープの代わりに独立したスコープで動作させることは可能ですhttp://jsfiddle.net/arunpjohny/gbfNY/1/ –

+0

@ArunPJohny、親スコープが更新されていません - '{{someObj。モデル| json}} '出力は空です。分離スコープとngモデルがどのように混在しないかについては、http://stackoverflow.com/questions/11896732/ngmodel-and-component-with-isolated-scopeを参照してください。 –

7

あなたが作成したので:Fiddle

孤立スコープは、それが正常に動作しない場合にはアイソngModel = "model"は、新しい隔離されたスコープを指します。あなたのAppControllerの範囲を参照したい場合は、$親を使用する必要があります。

コメントで述べたように
<test-ng-model ng-model="$parent.model" name="myel"></test-ng-model> 
+2

'scope:true'は分離スコープを作成しません。 –

+0

良い点。スコープが分離されていなくても、私のソリューションはとにかく動作します。しかし、あなたが提案するソリューションははるかに優れています。 –

関連する問題