【问题标题】:How to make directive re-render view in Angular?如何在Angular中制作指令重新渲染视图?
【发布时间】:2013-06-08 02:22:43
【问题描述】:

我想在每次数据更改和每个窗口的调整大小事件时动态截断文本。

假设我有一个 HTML:

<p ng-truncate='lines: 2'> Lorem ipsum dolor...</p>

我的指令进行了截断,但在调整窗口大小时仍然没有重新截断。

angular.module('moduleName', [])
  .directive 'ngTruncate', () ->
    link: (scope, element, attributes) ->
      // Direcive code here
      $(window).on 'resize', ->
        scope.$apply()
        scope.$digest()

很遗憾,$apply$digest() 都不起作用。

此外,我相信我应该以某种方式使用$window...

【问题讨论】:

    标签: angularjs scope coffeescript


    【解决方案1】:

    在您调用$apply$digest 调整大小之前,$scope 中可能没有任何变化。

    最好添加一些功能,例如:

    function onWindowChange() {
        // do some changes to any 
        // attributes of scope
        // and than apply them
        scope.$digest()
    }
    
    // and call it on window resize
    $window.resize(onWindowChange);
    

    或者你可能有会改变的功能 任何范围 attr,您需要调用很多 不同的事件,和$scope.$watch 这个属性 并在更改电话$scope.$digest

    如果您在这里发布整个指令代码,也许会更容易回答......

    【讨论】:

    • 不幸的是,更改 $(window) 上的任何范围值。on 'resize' 不会自动调用 $apply/$digest。
    • 两者都做 - 在更改任何范围值后在事件回调中调用 $apply/$digest
    【解决方案2】:

    是的 - 您可以使用$window 属性来监视窗口大小的变化。

    这是fiddle

    原始讨论可以在here找到(从那里挑选小提琴)

    【讨论】:

    • 我很欣赏这个答案,但是我相信这个指令应该对控制器是不可见的,纯粹是查看专用的代码。这可能吗?
    • 在小提琴中,您发现 $watch 位于控制器内部 - 您也可以在指令中移动此代码 - 在您提供的代码中,在链接函数内,您可以拥有$watch 代码。这就是你的意思是让一个指令对控制器不可见吗?
    猜你喜欢
    • 2015-09-17
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2012-08-23
    • 2013-08-22
    • 2016-05-08
    相关资源
    最近更新 更多