Angularjs: динамически созданная вкладка не становится активной / выбранной

0

У меня есть код ниже angularjs, который создает вкладки, нажимая новую кнопку. Но вновь созданная вкладка не становится активной или не выбрана после создания. Всегда один до последнего активируется! Кто-нибудь знает, что не так?

plnkr: https://plnkr.co/edit/1329tgGonObRQ6Drk75A?p=preview

HTML:

<!doctype html>
<html ng-app="plunker">
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.0/angular-animate.js"></script>
      <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.2.5.js"></script>
    <script src="example.js"></script>
         <link href="//netdna.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">



  </head>
  <body>

<div ng-controller="TabsParentController">


   <script type="text/ng-template" id="myModalContent.html">
        <div class="modal-header">
            <h3 class="modal-title">I'm a modal!</h3>
        </div>
        <div class="modal-body">
            <ul>
               Sure to delete?
            </ul>
            Selected: <b>{{ selected.item }}</b>
        </div>
        <div class="modal-footer">
            <button class="btn btn-primary" type="button" ng-click="ok()">OK</button>
            <button class="btn btn-warning" type="button" ng-click="cancel()">Cancel</button>
        </div>
    </script>


    <uib-tabset active="active">

        <uib-tab ng-repeat="workspace in workspaces"
             heading="{{workspace.name}}"
             >
            <div ng-controller="TabsChildController">
                <div>
                    {{$parent.workspace.id}} : {{ $parent.workspace.name}}
                </div>
                <input type="text" ng-model="workspace.name"/>
                 <button class="btn" type="button" ng-click="open('sm',workspace)">Delete</button>
            </div>     
        </uib-tab>
      <uib-tab index="0" select="addWorkspace()">
              <uib-tab-heading>
                <i class="glyphicon glyphicon-plus"></i>
            </uib-tab-heading>
        </uib-tab>
    </uib-tabset>
</div>
  </body>
</html>

Javascript:

var app = angular.module('plunker', ['ngAnimate','ui.bootstrap']);

app.controller("TabsParentController", function ($scope,$uibModal) {
  $scope.animationsEnabled = true;

  $scope.open = function (size, workspace) {

    var modalInstance = $uibModal.open({
      animation: $scope.animationsEnabled,
      templateUrl: 'myModalContent.html',
      controller: 'ModalInstanceCtrl',
      size: size,
      resolve: {

         workspace: function () {
          return workspace;
        }

      }
    });

    modalInstance.result.then(function (selectedItem) {
       var index=$scope.workspaces.indexOf(selectedItem)
      $scope.workspaces.splice(index,1);     
    }, function () {
      $log.info('Modal dismissed at: ' + new Date());
    });
  };



    var setAllInactive = function() {
         //angular.forEach($scope.workspaces, function(workspace) {
           // workspace.active = false;
   // });
    };
    var addNewWorkspace = function() {

        var id = $scope.workspaces.length+1 ;

        $scope.workspaces.push({
            id: id,

            name: "Workspace " + id,

        });
        $scope.active=$scope.workspaces.length -1;


    };

    $scope.workspaces =
    [

    ];

    $scope.addWorkspace = function () {
        setAllInactive();
        addNewWorkspace();

    };    


     $scope.remove=function(item){ 
      var index=$scope.workspaces.indexOf(item)
      $scope.workspaces.splice(index,1);     
    }

});

angular.module('plunker').controller('ModalInstanceCtrl', function ($scope, $uibModalInstance, workspace) {

  $scope.selectedworkspace = workspace;

  $scope.ok = function () {
    $uibModalInstance.close( $scope.selectedworkspace );
  };

  $scope.cancel = function () {
    $uibModalInstance.dismiss('cancel');
  };
});




app.controller ("TabsChildController", function($scope, $log){

});
  • 0
    Как работает этот uib-tabset active="active" ? Это похоже на директиву, но я не могу найти какое-либо определение директивы в вашем коде.
  • 0
    @ emil.c его загрузочный тег angularjs, импортированный: //angular-ui.github.io/bootstrap/ui-bootstrap-tpls-1.2.5.js
Показать ещё 10 комментариев
Теги:
angular-bootstrap

1 ответ

3
Лучший ответ

Если вы хотите, чтобы новая вкладка была активной, вам нужно установить

$scope.active = $scope.workspaces.length;

но другая проблема заключается в том, что при нажатии новой рабочей области. потребуется немного времени для того, чтобы директива повторно отображала DOM и все готовые переменные области. поэтому сразу после нажатия, если вы попытаетесь назначить новую вкладку как активную, это приведет к ошибке.

Итак, чтобы быстро доказать свою точку зрения (не самый правильный путь), попробуйте это, и ваш код будет работать. Не забудьте ввести $ timeout как зависимость

app.controller("TabsParentController", 
    function ($scope,$uibModal, $timeout) {


        ....
        ....

        $scope.workspaces.push({
            id: id,
            name: "Workspace " + id,
        });

        //introduce a 50 ms delay before setting the active tab
        $timeout(function(){
           $scope.active = $scope.workspaces.length;
        }, 50);

        ....
        ....

    }
);

видеть это в плункер

  • 0
    Спасибо за ответ, да, кажется, вы правы. Есть ли способ создать функцию, которая устанавливает активную вкладку после успешного завершения функции AddNewTab? Я ищу что-то подобное get.then или get или success, которое может вызвать функцию после успешного завершения get! есть ли такая вещь для функций?
  • 0
    @ user3033921 когда я впервые посмотрел на твою проблему. У меня был точно такой же вопрос, как у emily.c. Если вы можете подождать, пока директива будет готова, тогда установите активную, она будет наиболее идеальной. Для этой части вам, вероятно, придется искать документацию самостоятельно. Мой ответ был подтверждением концепции о том, что вам нужно подождать. ура
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню