【问题标题】:Angular multiple directives error on md-datepickermd-datepicker 上的角度多指令错误
【发布时间】:2016-05-15 15:59:33
【问题描述】:

我正在制作一个动态的日期列表。用户可以添加他想要的所有datepickers,但我必须验证没有匹配的日期,它们都必须不同,这是唯一的必要条件。

我已经进行了自定义指令验证并且它被正确触发,但是当我尝试使用它的隔离范围时,我得到了那个错误(多个指令)。我在这里看到的其他问题/解决方案建议删除隔离范围,但我需要将日期数组传递给指令并能够将它们与当前选择的进行比较。

这是重现问题的codepen。如果您删除noMatchingDates 指令的scope,错误就会消失,您可以正确查看和添加日期选择器。我的意思是scope:

scope: {
  getAllDates: "&allDates"
}

我认为这与docs中的这一行有关:

多个指令请求隔离范围。

它可能还与 md-datepicker 有关,它使用隔离范围会有更多指令。那么,我该如何解决这个错误(并且仍然能够发送日期列表)?

如果由于md-datepicker 的性质而无法解决(保持范围),我该如何进行动态验证?我认为这可以使用控制器和ng-change 来完成,但我不确定这是否是一个合适的解决方案。

【问题讨论】:

    标签: angularjs angularjs-directive angular-material isolate-scope


    【解决方案1】:

    确实,您的指令没有理由要求隔离范围。当您的指令类似于可重用的“可视组件”时,请使用隔离范围。您的指令是关于逻辑验证的,不应阻止另一个此类组件。

    要解决您的问题,您可以删除隔离范围并以这种方式在 HTML 中使用您的指令:

    <div ... no-matching-dates="overtimeList">
    

    然后在您的链接函数中,您可以通过这种方式检索该属性的值:

    var dates = scope.$parse(attr.noMatchingDates);
    

    这将为您提供绑定到no-matching-dates 的内容,因此在这种情况下它将返回overtimeList

    我从未使用过ctrl.$parsers.unshift 语法,但您似乎也可以使用它来检索该值。只需删除我刚刚给您的scope.$parse 行并写下:

    ctrl.$parsers.unshift(function(arrayOfDates) { ... })
    

    这应该也可以。请注意,在第一种方法中,如果您想每次都运行验证,则需要 $watch 进行更改。

    【讨论】:

    • 谢谢,我认为它有效,但无论如何我仍然有这个问题。通过no-matching-dates 传递日期数组,它只会给我直到当前日期被修改的日期。例如,如果我有 5 个日期选择器并且我正在修改第 3 个日期,我只会得到三个第一个日期,而其余 (2) 个日期则丢失了......同样,如果我正在修改第 4 个日期,我只是得到 4 个第一次约会,最后一个约会不见了...... :(
    • 顺便说一句@floribon,我应该在哪里以及如何$watch 进行更改?
    • 您可以使用scope.$watch(attr.noMatchingDates) 来查看overtimeList 上的引用变化。或者,如果这是一个将就地更新的数组,您可以使用$watchCollection。不幸的是,你的用例和问题有点太宽泛了,你应该写一个关于你的问题的小例子,并就任何特定点提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2019-02-01
    • 2017-05-16
    • 2016-03-26
    • 2015-04-17
    相关资源
    最近更新 更多