2016-07-12 6 views
2

私はinput-textと呼ばれる簡単な指示文を持っています。これは基本的に入力コントロールをラップします。カスタムディレクティブに変更をラップする方法は?

input-textに与えられた値はng-modelに渡され、正常に動作します。今私はまた、input-changeという属性にこれを渡すことによって、モデルの変更に応じて呼び出される関数を渡したいと思います。

angular.module('test').directive('inputText', function() { 
    return { 
    restrict : 'A', 
    scope : { 
     inputText : '=' 
    }, 
    template : '<input ng-model="inputText" />', 
    link : function(scope, element, attr) { 
     var model = element.find('input').controller('ngModel'); 
     model.$viewChangeListeners.push(function() { 
     scope.$parent.$eval(attr.inputChange); 
     }); 
    } 
    } 

}); 

詳細はhttp://plnkr.co/edit/qC7FlxVNKH4SrAhLoJy4を参照してください。

コントロールに入力するたびに関数が呼び出されますが、コンソールにログインした値は現在のコントロール(ただし前のもの)の$viewValueではありません。

Iはまた、そうのような入力制御にng-changeinput-changeにに与えられた文字列を渡すことにより、別のアプローチを試みた:

angular.module('test').directive('inputText', function() { 
    return { 
    restrict : 'A', 
    scope : { 
     inputText : '=', 
     inputChange : '&' 
    }, 
    template : '<input ng-model="inputText" ng-change="inputChange()" />', 
    } 

}); 

http://plnkr.co/edit/SutAFnCgo10QNmvBFsDs

をしかし、出力が上記の例と同様です。

誰かがこの動作を説明したり、ここで何が問題になっているのかを教えてください。

答えて

0

これを回避する1つの方法は、入力値をそのinput-changeバインディングに明示的に公開することです。

<input ng-model="inputText" ng-change="inputChange({value: inputText})" /> 

そして内側のスコープではなく、外側のスコープからtest.model.name変数からそのvalue変数を使用します:input-change="test.callback(value)"

http://plnkr.co/edit/SNatIAkPIHFSMooMWWFS?p=preview


Aあなたはこのテンプレートを使用することができることを行うために、 2番目の選択肢は、scope.$watchで変更を監視し、トリガされたときにのみ機能をトリガーすることです。

link: function(scope) { 
    scope.$watch('inputText', function(n) { 
    scope.inputChange(); 
    }); 
} 

http://plnkr.co/edit/Vrwe3SC3ejMG4aFIwBTU?p=preview

+0

私も前に、あなたの最初の提案を試みたが、これは私が関数にパラメータの変化量を置きたいかもしれないので、非常に柔軟性のないことを思い付きました。 2番目はかなり明白であり、うまくいきます、ありがとう。それでも、私の説明したケースでは、なぜその動作が奇妙なのかを知りたいと思います。 –

+0

@ M.Redemskeオプション1を使用すると、他の変数を使用することはできません。それは地元の人々として 'value'を追加しません。たとえば、 'test.callback(model1、value、model2)'と、スコープの上にあるmodel1とmodel2と、そのディレクティブが提供する 'value'を書くことができます。なぜあなたが問題を抱えているかについては、私も個人的にそれを得て、それがAngular自身のバグかng-changeで明確ではないバグか分かっていませんでした。 – floribon

関連する問題