【问题标题】:md-max date working but getting this angular error as soon as I am setting md-max-datemd-max 日期工作,但一旦我设置 md-max-date 就会出现这个角度错误
【发布时间】:2017-06-18 17:16:21
【问题描述】:

我正在尝试像这样设置今天的最大日期:

My controller:

vm.maxDate= maxDate;
function maxDate() {
    return new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate());
}

我的 HTML:

<md-datepicker
             md-placeholder="Date of Creation"
             md-max-date="myCtrl.maxDate()"
             ng-model="myCtrl.form.startDate">
</md-datepicker>

它按预期工作,用户无法在 maxDate 之后选择任何内容。但是一旦我在我的 html 中写 md-max-date="myCtrl.maxDate()" ,我就会得到这个角度错误。我不知道为什么会这样。任何帮助将不胜感激。谢谢

这是错误链接 Link To Error

这是错误:

错误:$rootScope:infdig 无限 $digest 循环

达到 10 次 $digest() 迭代。中止! 观察者在最后 5 次迭代中触发: [[{"msg":"fn: function (c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}","newVal":"2017-06-18T04:00:00.000Z","oldVal":"2017-06-18T04:00:00.000Z"}],[{" msg":"fn: 函数 (c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);返回 b(f,c,e)}"," newVal":"2017-06-18T04:00:00.000Z","oldVal":"2017-06-18T04:00:00.000Z"}],[{"msg":"fn: 函数 (c,e, f,g){f=d&&g?g[0]:a(c,e,f,g);返回 b(f,c,e)}","newVal":"2017-06-18T04:00: 00.000Z","oldVal":"2017-06-18T04:00:00.000Z"}],[{"msg":"fn: 函数 (c,e,f,g){f=d&&g?g[0 ]:a(c,e,f,g);返回 b(f,c,e)}","newVal":"2017-06-18T04:00:00.000Z","oldVal":"2017-06 -18T04:00:00.000Z"}],[{"msg":"fn: 函数 (c,e,f,g){f=d&&g?g[0]:a(c,e,f,g) ;返回 b(f,c,e)}","newVal":"2017-06-18T04:00:00.000Z","oldVal":"2017-06-18T04:00:00.000Z"}]]

【问题讨论】:

    标签: angularjs datepicker angular-material


    【解决方案1】:

    更改控制器以初始化最大日期:

    vm.maxDate= initMaxDate();
    function initMaxDate() {
        return new Date((new Date()).getFullYear(), (new Date()).getMonth(), (new Date()).getDate());
    }
    

    HTML

    <md-datepicker
         md-placeholder="Date of Creation"
         md-max-date="myCtrl.maxDate ̶(̶)̶ "
         ng-model="myCtrl.form.startDate">
    </md-datepicker>
    

    当 AngularJS 模板包含带有函数的 AngularJS 表达式时,框架会多次执行该函数,直到表达式稳定。由于函数每次都返回一个新的 Date 对象,所以作用域变量永远不会稳定,导致$rootScope:infdig error

    AngularJS 将应用程序分为模型、视图和控制器。控制器创建和修改模型,模板根据模型渲染视图。模板永远不应该创建模型。它应该只根据模型渲染视图并向控制器提供事件以修改模型。

    【讨论】:

    • 感谢@georgeawg 提供解决方案和对此错误的解释。
    • 很好的解释!!
    • 虽然模板可以用 Angular 表达式做很多事情,但应该明智地使用这种能力。
    【解决方案2】:

    我认为 MIN 和 Max 将采用变量而不是函数作为输入

    <md-datepicker
                 md-placeholder="Date of Creation"
                 md-max-date="myCtrl.maxDate"
                 ng-model="myCtrl.form.startDate">
    </md-datepicker>
    

    控制器

    var today = new Date();
    $scope.maxDate = new Date(today.getFullYear(), today.setMonth(), today.getDate());
    

    注意:- 为什么要为年、月和日期创建新数据,您可以像这样尝试。这是简单而正确的方法。 更多信息 https://material.angularjs.org/latest/demo/datepicker

    plnkr.co/edit/jEd8I2IbxypVPu0uGU1y?p=preview

    【讨论】:

    • 我试图这样做,如此处所示 material.angularjs.org/latest/demo/datepicker 但它不起作用。它消除了错误,但最大日期不起作用
    • 您的做法不同。您的分配函数而不是变量。
    • 我最初尝试了这里显示的功能。material.angularjs.org/latest/demo/datepicker。然后我开始工作。
    • 感谢@Jonnysai 的帮助,但 georgeawg 的解决方案有效。我认为这就是问题所在。他的解释对 angular 抛出的错误是有道理的:范围变量永远不会稳定,导致 $rootScope:infdig 错误
    • 哦,太好了!!。但我已经很笨拙了。 plnkr.co/edit/jEd8I2IbxypVPu0uGU1y?p=preview
    猜你喜欢
    • 2017-05-16
    • 2021-08-19
    • 2020-05-02
    • 2019-09-21
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    相关资源
    最近更新 更多