私はこの単純なシナリオを持っています:
JQueryのval()メソッドによって値が変更される入力要素。
JQueryが設定した値で角度モデルを更新しようとしています。私は簡単なディレクティブを書き込もうとしましたが、それは私が望むことをしていません。
これが指令です:
var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
return function(scope, element, attrs) {
element.bind('change', function() {
console.log('value changed');
})
}
})
これがjQueryの部分です。
$(function(){
$('button').click(function(){
$('input').val('xxx');
})
})
そしてhtml:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
</div>
</div>
<button>clickme</button>
これが私の試みの謎です:
http://jsfiddle.net/U3pVM/743/
誰かが私を正しい方向に向けてください。
ngModelは "input"イベントをリッスンするので、値を設定した後にそのイベントを発生させる必要があるコードを "修正"するために:
$('button').click(function(){
var input = $('input');
input.val('xxx');
input.trigger('input'); // Use for Chrome/Firefox/Edge
input.trigger('change'); // Use for Chrome/Firefox/Edge + IE11
});
この特定の振る舞いの説明については、私が少し前に述べた答えをチェックしてください。 " AngularJSは内部で 'onclick'、 'onchange'のようなイベントをどのようにキャッチしますか? "
しかし残念ながら、これが唯一の問題ではありません。他の投稿コメントで指摘されているように、あなたのjQuery中心のアプローチは明らかに間違っています。詳細については、この記事をご覧ください。 私がjQueryのバックグラウンドを持っている場合、どのようにして“ AngularJSを考えますか?” )。
これが誰かに役立つことを願っています。
jQuery('#myInputElement').trigger('input')
イベントを自分のAngularアプリに拾うことができませんでした。
しかし、私はangular.element(jQuery('#myInputElement')).triggerHandler('input')
を手に入れることができました。
ここではjQueryが必要だとは思わない。
代わりに $ watch と ng-click を使用できます。
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
<button ng-click=" foo= 'xxx' ">click me</button>
<!-- this changes foo value, you can also call a function from your controller -->
</div>
</div>
あなたのコントローラで:
$scope.$watch('foo', function(newValue, oldValue) {
console.log(newValue);
console.log(oldValue);
});
次のように特定の入力モデルの範囲を更新するためには、次のコードを使用する必要があります。
$('button').on('click', function(){
var newVal = $(this).data('val');
$('select').val(newVal).change();
var scope = angular.element($("select")).scope();
scope.$apply(function(){
scope.selectValue = newVal;
});
});
JQueryでinput
イベントをトリガーしていたという受け入れられた答えは私にとってはうまくいきませんでした。イベントを作成し、ネイティブのJavaScriptを使用してディスパッチするとうまくいきます。
$("input")[0].dispatchEvent(new Event("input", { bubbles: true }));
アクションボタンにリスナーを追加して、コントローラの初期化のみを変更しました。
$(document).on('click', '#action-button', function () {
$timeout(function () {
angular.element($('#input')).triggerHandler('input');
});
});
他の解決策は私の場合はうまくいきませんでした。
ここで答えるのは少し遅れていることを私は知っていますが、多分私は一日一日を節約するかもしれません。
私は同じ問題に取り組んできました。 jQueryからの入力値を更新すると、モデルは移入されません。トリガーイベントを使用しようとしましたが、結果が得られませんでした。
これは私があなたの日を救うかもしれないことでした。
Scriptタグ内の変数をHTMLで宣言します。
好きです:
<script>
var inputValue="";
// update that variable using your jQuery function with appropriate value, you want...
</script>
一度角のサービスを使用してそれをやった。
$ window
以下では、同じコントローラスコープから呼び出されたgetData関数によって、必要な値が得られます。
var myApp = angular.module('myApp', []);
app.controller('imageManagerCtrl',['$scope','$window',function($scope,$window) {
$scope.getData = function () {
console.log("Window value " + $window.inputValue);
}}]);
IEを使用している場合は、次のものを使用する必要があります。input.trigger( "change");
値を設定した後に.change()
を追加してください。
例:('id').val.('value').change();
htmlにonchange
またはng-change
タグを追加することも忘れないでください
私はjQueryのためのこの小さなプラグインを書きました。これは.val(value)
へのすべての呼び出しを行い、存在する場合にはangle要素を更新します。
(function($, ng) {
'use strict';
var $val = $.fn.val; // save original jQuery function
// override jQuery function
$.fn.val = function (value) {
// if getter, just return original
if (!arguments.length) {
return $val.call(this);
}
// get result of original function
var result = $val.call(this, value);
// trigger angular input (this[0] is the DOM object)
ng.element(this[0]).triggerHandler('input');
// return the original result
return result;
}
})(window.jQuery, window.angular);
JQueryとangular.jsとval(value)
更新の後にこのスクリプトをポップするだけでいいですね。
縮小版:
!function(n,t){"use strict";var r=n.fn.val;n.fn.val=function(n){if(!arguments.length)return r.call(this);var e=r.call(this,n);return t.element(this[0]).triggerHandler("input"),e}}(window.jQuery,window.angular);
例:
// the function
(function($, ng) {
'use strict';
var $val = $.fn.val;
$.fn.val = function (value) {
if (!arguments.length) {
return $val.call(this);
}
var result = $val.call(this, value);
ng.element(this[0]).triggerHandler('input');
return result;
}
})(window.jQuery, window.angular);
(function(ng){
ng.module('example', [])
.controller('ExampleController', function($scope) {
$scope.output = "output";
$scope.change = function() {
$scope.output = "" + $scope.input;
}
});
})(window.angular);
(function($){
$(function() {
var button = $('#button');
if (button.length)
console.log('hello, button');
button.click(function() {
var input = $('#input');
var value = parseInt(input.val());
value = isNaN(value) ? 0 : value;
input.val(value + 1);
});
});
})(window.jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div ng-app="example" ng-controller="ExampleController">
<input type="number" id="input" ng-model="input" ng-change="change()" />
<span>{{output}}</span>
<button id="button">+</button>
</div>
Vanilla/jQueryを使用して外部からngModelの値を更新できるようにするために、これを行いました。
function getScope(fieldElement) {
var $scope = angular.element(fieldElement).scope();
var nameScope;
var name = fieldElement.getAttribute('name');
if($scope) {
if($scope.form) {
nameScope = $scope.form[name];
} else if($scope[name]) {
nameScope = $scope[name];
}
}
return nameScope;
}
function setScopeValue(fieldElement, newValue) {
var $scope = getScope(fieldElement);
if($scope) {
$scope.$setViewValue(newValue);
$scope.$validate();
$scope.$render();
}
}
setScopeValue(document.getElementById("fieldId"), "new value");