这是我的HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />当我在框中输入内容时,该模型会通过2向绑定机制进行更新。甜。
但是,当我通过JQuery执行此操作时...
$('#selectedDueDate').val(dateText);它不会更新模型。为什么?
这是我的HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />当我在框中输入内容时,该模型会通过2向绑定机制进行更新。甜。
但是,当我通过JQuery执行此操作时...
$('#selectedDueDate').val(dateText);它不会更新模型。为什么?
Answers:
Angular不知道这种变化。为此,您应该在以下位置致电$scope.$digest()或进行更改$scope.$apply():
$scope.$apply(function() { 
   // every changes goes here
   $('#selectedDueDate').val(dateText); 
});看到这个以更好地了解脏检查
更新:这是一个例子
function$ scope。$ apply传递一个函数作为参数。在$ scope上进行更改时,应该调用$ apply,因此,在onSelect内。嗯,我希望您仅以示例为例,将DOM操作放入控制器内,这在实际应用中是错误的;)
                    datepicker="scopeKeyThatYouWant"输入
                    只需使用;
$('#selectedDueDate').val(dateText).trigger('input');trigger('input')在onSelect事件处理程序中使用了日期选择器。它会正确更新值。
                    .val('something'调用在$apply(或$digest随后调用)中不起作用。
                    $('#selectedDueDate').val(dateText).trigger('change');对我不起作用的东西。.trigger('input');像魔术一样工作
                    我发现,如果不将变量直接放在范围内,它将更可靠地进行更新。
尝试使用一些“ dateObj.selectedDate”,然后在控制器中将selectedDate添加到dateObj对象,如下所示:
$scope.dateObj = {selectedDate: new Date()}这对我有用。
只需在函数末尾运行以下行:
$ scope。$ apply()
无论在Angular范围之外发生什么,Angular都不会知道。
摘要循环将更改从模型->控制器,然后从控制器->模型更改。
如果需要查看最新型号,则需要触发摘要周期
但是有可能正在进行一个摘要循环,因此我们需要检查并初始化该循环。
最好始终执行安全的申请。
       $scope.safeApply = function(fn) {
            if (this.$root) {
                var phase = this.$root.$$phase;
                if (phase == '$apply' || phase == '$digest') {
                    if (fn && (typeof (fn) === 'function')) {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            }
        };
      $scope.safeApply(function(){
          // your function here.
      });AngularJS通过值传递字符串,数字和布尔值,而通过引用传递数组和对象。因此,您可以创建一个空对象,并使日期成为该对象的属性。以这种方式,角度将检测模型的变化。
在控制器中
app.module('yourModule').controller('yourController',function($scope){
$scope.vm={selectedDate:''}
});在html中
<div ng-controller="yourController">
<input id="selectedDueDate" type="text" ng-model="vm.selectedDate" />
</div>您必须触发输入元素的change事件,因为ng-model会监听输入事件,并且范围将被更新。但是,常规jQuery触发器对我不起作用。但这就像魅力一样
$("#myInput")[0].dispatchEvent(new Event("input", { bubbles: true })); //Works追踪无效
$("#myInput").trigger("change"); // Did't work for me您可以阅读有关创建和调度综合事件的更多信息。
我已经为jQuery写了这个小插件,它将进行所有调用以.val(value)更新angular元素(如果存在):
(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);例:
只需使用:
$('#selectedDueDate').val(dateText).trigger('input');代替:
$('#selectedDueDate').val(dateText);