angulaire.js - Si une directive personnalisée est imbriquée dans la directive ng-repeat d'angularjs, le contenu ne sera pas rendu correctement.
漂亮男人
漂亮男人 2017-05-15 16:56:51
0
2
527

component_list.tpl

<p class="component-list">
    <ul class="nav nav-tabs" id="PlugTabs" role="tablist">
        <li role="presentation" ng-repeat="component_type in component_list" 
            ng-class="{active:$first}">
            <a href="#{{component_type.id}}" role="tab" data-toggle="tab" 
                aria-controls="{{component_type.id}}" aria-expanded="true" 
                ng-bind="component_type.name"></a>
        </li>
    </ul>
    <p class="tab-content" id="PlugContent">
        <p role="tabpanel" class="tab-pane fade active in" 
            ng-repeat="component_type in component_list" 
            ng-class="{active:$first,in:$first}" 
            id="{{component_type.id}}">
            <ul class="list-group">
                <li class="list-group-item" ng-repeat="component_group in component_type.list">
                    <a href="#" class="list-group-header" ng-bind="component_group.name"></a>
                    <p class="boxes">
                        <p se-component></p>
                    </p>
                </li>
            </ul>
        </p>
    </p>
</p>

composant.tpl

<p class="box" ng-repeat="component in component_group.list" 
    controller="{{component.controller}}" draggable="true">
    <img src="{{component.image}}">
    <label ng-bind="component.name"></label>
</p>

directive

// se-component-list
Base.directive('seComponentList', function() {
    return {
        restrict: 'E',
        replace: true,
        templateUrl: STATIC_PATH + 'js/seditor/tpls/base.component_list.tpl',
        controller: ['$scope', 'InitBaseData', function($scope, InitBaseData) {
            InitBaseData.getComponentList().success(function(data) {
                if (data && data.code == 0) {
                    $scope.component_list = data.component_list;
                } else {
                    alert('网络异常,请稍后重试');
                }
            }).error(function(err) {
                alert('网络异常,请稍后重试');
            });
        }]
    };
});
// se-component
Base.directive('seComponent', function() {
    return {
        restrict: 'A',
        replace: true,
        templateUrl: STATIC_PATH + 'js/seditor/tpls/base.component.tpl',
        link: function(scope, element, attr) {
            element.bind('drop', function(event) {
                event.preventDefault();
                console.log('drop');
            });
        }
    }
});

Description du problème : si je remplace directement le contenu de composant.tpl par <se-component></se-component>, la sortie est normale, mais je dois ajouter un événement glisser pour le composant. Le problème actuel est que le contenu qui doit être affiché dans les autres cases est entièrement affiché dans la dernière case. Je viens d'apprendre Angular il n'y a pas longtemps. La question est peut-être superficielle, mais je ne trouve pas la réponse. Merci. .

漂亮男人
漂亮男人

répondre à tous(2)
仅有的幸福

ng-repeat créera sa propre portée, et la sous-portée devra
$parent.xxx
accéder au $scope du contrôleur

Il est recommandé que votre seComponent obtienne du contenu en définissant des attributs

<p se-component list="component_type.list"></p>
//具体是不是这样写忘了...,需要验证下,就是这个意思
PHPzhong

J'ai trouvé que si le remplacement : vrai du composant se est supprimé, l'affichage sera normal, mais il y aura une balise supplémentaire de <se-component>, ce qui n'est pas beau

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal