7

次のコードがあります。JSON をループして、ネストされた ul リストを生成します。アンカー タグにバインドされた関数 toggleNav() を実行するクリック イベントがあります。クリック イベントが要素に 2 回バインドされている理由がわかりません。また、私はAngularが初めてですが、この概念を説明するドキュメントはありますか? ありがとう!

define([
'/assets/angularapp/AppDirectives.js',
'highstock'
], function (directives) {
directives.directive('collection', function () {
    return {
        restrict: "E",    //declare by element
        replace: true,
        scope: {
            collection: '='
        },
        template: "<ul class=\"nav nav-list tree\"><member ng-repeat=\"member in collection\" member=\"member\"></member></ul>"
    }
})

directives.directive('member', function ($compile) {

    return {
        restrict: "E",
        replace: true,
        scope: {
            member: '='
        },
        template: "<li ng-show=\"member.open\"><span><input type=\"checkbox\" ng-model=\"member.selected\" class=\"sideChkbox\"><a class=\"tree-toggle\" ng-click=\"toggleNav()\"><i class=\"icon-chevron-right\"></i>{{member.data}}</a></span></li>",
        controller: function($scope, $element){
            $scope.toggleNav = function(){
                angular.forEach($scope.member.children,function(child,key){
                    if(child.open==true){
                        alert("a")
                        child.open=false;
                    } else {
                        child.open=true;
                        alert("b")

                    }

                })

            }
        },
        link: function (scope, element, attrs) {
            if (angular.isArray(scope.member.children)) {
                 element.append("<collection collection='member.children'></collection>");
                $compile(element.contents())(scope)
            }
        }
    }
})
4

2 に答える 2

2

@Mr.DucNguyenの答えは正しいですが、DOMをさらに操作したくない場合は、別の方法でアプローチできます。

リンク機能中に要素に完了フラグを付けて、再度リンクしようとすると失敗します。

link: function (scope, element, attrs) {
    // stop an already linked element from continuing
    if (element.attr('collection-linked')) {
        return;
    }
    // otherwise, add a completed flag to this element
    element.attr('collection-linked', true);

    // continue your linking ...
}
于 2014-04-11T23:08:00.043 に答える