AngularJS指令只调用一次?

时间:2014-06-21 09:04:41

标签: javascript jquery angularjs directive

我正在尝试在我的角度页面中推送mixitup,为了做到这一点,我为它制作了一个指令模块

angular.module('MainCtrl', [])
    .controller('MainController', function($scope) {
        $scope.tagline = 'To the moon and back!';   
    })
    .directive('mixitContainer', function() {
        return {
            restrict: 'A',
            link: function(scope, element, attrs) {
                $(element).mixItUp(scope.$eval(attrs.mixitContainer));
            }
        };
    });

不要担心主控制器的简单性,它只是一个测试。

现在,问题是该指令只被调用一次!如果我转到另一个页面并请求angular加载另一个控制器,然后返回主页并要求angular再次加载MainCtrl,则不加载该指令!

继续使用指令:

<div id="Container" class="mixit-container" mixit-container="{load: {sort: 'order:asc'}, controls: {toggleFilterButtons: true, toggleLogic: 'and'}}">

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

AngularJS不包含路由设施。这些是由ngRoute(一个核心但可选的模块),ui-router(ngRoute制作超级令人惊叹的)或其他替代品提供的。你不会说你使用哪种,每种都有不同的行为。

无论是哪种,这都将归结为路由器,而不是指令。必要时将调用该指令。它本身并不能控制自己 - 必要的&#39;意味着Angular正在编译DOM的一部分,通常来自模板文件,并且已经运行到指令中。它将调用指令并询问它现在是什么?&#34;

上述路由器具有不同的行为,彼此之间以及内部配置方式也各不相同。在所有这些中,您可以安排事情,以便模板执行或不执行重新渲染。例如,在ui-router中,您可以拥有“孩子”。状态。如果您的子状态处于活动状态,则父级也处于活动状态...因此从子级转到父级将不会重新呈现模板,因为它已经在之前完成。为了使问题更复杂,您甚至可以通过挂钩$stateChangeStart事件来强制执行此操作,并强制路由器重绘该视图,即使它认为不需要。

所有这些意味着......将注意力放在你的指令之外。一旦更高级别达到你想要的效果,它就会做你想要的。让您的路由器按照您期望的方式运行,您会很高兴!