9

当我从 angularjs 1.1.4 玩 ng-view 和 ng-animate 时,我注意到指令被执行了两次。一次用于进入屏幕的视图中的元素,再次用于离开屏幕的视图中的元素(当视图进入屏幕时,该指令已经为元素执行)。

据我了解,指令应该只对进入屏幕的元素执行,而不是对离开的元素执行。还是我错过了什么?

<div ng-app="app">
    <div ng-controller="AppCtrl">
        <div class="btn-group">
            <a class="btn btn-primary" href="./">foo</a>
            <a class="btn btn-primary" href="bar/">bar</a>
        </div>
        <span class="btn btn-success">{{count}}</span>
        <div class="view" ng-view ng-animate="{enter: 'view-enter', leave: 'view-leave'}"></div>
    </div>
</div>
var app = angular.module('app', []);

app.config(function ($routeProvider, $locationProvider) {
    $routeProvider
        .when('/', {
            template: '<h1 color>foo</h1>'
        })
        .when('/bar', {
            template: '<h1 color>bar</h1>'
        })
        .otherwise({
            redirectTo: '/'
        });

    $locationProvider.html5Mode(true);
});

app.controller('AppCtrl', function ($scope) {
    $scope.count = 0;
    $scope.incrementCount = function () {
        $scope.count++;
    }
});

app.directive('color', function () {
    return {
        restrict: 'A',
        link: function ($scope, $element, $attrs) {
            // executed once the app inits but
            // twice when you change the view
            $scope.incrementCount();
        }
    }
});

我已经为此http://jsfiddle.net/mediastuttgart/f4FPj/1/设置了一个jsfiddle

如您所见,应用程序启动时计数器显示为 1。但如果您开始导航,计数器会增加 2。

干杯迈克尔

编辑

当然,一种解决方法可能是向元素添加一个类并在指令中检查它——但我想这不是应该完成的方式。

link: function ($scope, $element, $attrs) {
    if ($element.hasClass('processed')) return;
    $element.addClass('processed');
    $scope.incrementCount();
}

http://jsfiddle.net/mediastuttgart/f4FPj/2/

4

2 回答 2

2

它将为指令处理的每个事件触发指令。看到这个小提琴,如果你删除离开事件,它只会触发一次。

<div class="view" ng-view ng-animate="{enter: 'view-enter'}"></div>

http://jsfiddle.net/WmSP8/1/

注意文档说“event1 和 event2 属性是指特定于已分配指令的动画事件。”(http://code.angularjs.org/1.1.4/docs/api/ng.directive:ngAnimate

它本质上是说您可以使用并非所有指令中都存在的自定义事件来构建指令,并且动画器服务将允许您的指令知道当这些事件在您的指令中触发时要运行哪些动画。但是,这意味着您的指令可能会为您的 ng-animate 属性中处理的每个事件执行。因此,当您同时配置进入和离开时,指令都会为它们执行。

我实际上并没有编写任何代码来测试这一点,这只是我对文档的解释,jsfiddle 似乎证实了一般前提。

于 2013-05-03T12:27:36.340 回答
0

angular 1.1.5 似乎解决了这个问题。猜猜这个提交已经修复了它ngView: accidentally compiling leaving content (9956baed) https://github.com/angular/angular.js/commit/9956baedd73d5e8d0edd04c9eed368bd3988444b

于 2013-06-25T05:53:08.157 回答