29

Я думаю, что я что-то упускаю, но не могу понять, что.
В основном я пытаюсь передать объект модальному, как показано ниже, но вместо того, чтобы получить переданный объект, я получаю null ... поэтому я думаю, что это проблема с областью действия, но я новичок в Angular и нуждаюсь в некоторой помощи ,AngularJS, передающий данные в bootstrap modal

Контроллер

app.controller("musicViewModel", function ($scope, $http, $location, $uibModal, $log) { 

$scope.selected = null; 

$scope.open = function (item) { 

    $scope.selected = item; 

    $log.info('Open' + $scope.selected); // get right passes object 

    var modalInstance = $uibModal.open({ 
     templateUrl: 'myModalContent.html', 
     controller: 'musicViewModel', 
     size: 'lg', 
     resolve: { 
      items: function() { 
       return $scope.selected; 
      } 
     } 
    }); 
}; 

$scope.toggleAnimation = function() { 
    $scope.animationsEnabled = !$scope.animationsEnabled; 
}; 
}); 

Посмотреть

<div class="row" ng-controller="musicViewModel"> 
    <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> 
       <li> 
        {{ selected }} // always gets null 
       </li> 
      </ul> 
     </div> 
    </script> 
</div> 

ответ

59

Я предлагаю вам пройти scope собственного контроллера вместо передачи такой же controller снова, делая это, вы можете удалить resolve также.

var modalInstance = $uibModal.open({ 
    templateUrl: 'myModalContent.html', 
    scope: $scope, //passed current scope to the modal 
    size: 'lg' 
}); 

В противном случае вам нужно создать новый controller и назначить этот контроллер для modal во время его открытия.

+0

@PankajParkar вы в состоянии, чтобы обеспечить пример последнего решения для обеспечения контроля Лер? Мне трудно работать, чтобы работать. Вот мой вопрос, который касается: http://stackoverflow.com/questions/35350463/angular-uibmodal-resolve-unknown-provider – Thomas

+0

Я думаю, что ниже ответ должен помочь вам. Я буду смотреть в это. –

22

Когда вы используете разрешение, карта вводится в данный контроллер.

Я рекомендую использовать другой контроллер для обработки модальной функциональности (separation of concerns).

Я также рекомендую использовать инъекцию зависимостей для поддержки минимизации кода. Step 5 на Угловом учебнике, объясните это.

Упрощенный пример модального контроллера.

(function() { 

    'use strict'; 

    var app = angular.module('App'); 

    app.controller('musicDetailController', 

       ['$scope', '$uibModalInstance', 'items', 
     function ($scope, $uibModalInstance, items) { 

      $scope.items = items; 

     }]); 
}()); 
+1

Да, я согласен с вами. Использование отдельного контроллера позволит правильно управлять кодом. – BlueBird

1

Вы не можете передать объект напрямую.

Я пробовал все решения выше, но на самом деле не был удовлетворен. Я решил проблему, написав простой синтаксический анализатор, который позволяет передавать как strings, так и objects непосредственно в модаль через предоставленную функцию разрешения.

app.controller('ModalController', ['$uibModal', '$scope', function ($uibModal, $scope) { 

    // Initialize $modal 
    var $modal = this; 

    // Open component modal 
    $modal.open = function (component, size, data) { 

     // Init modal 
     var modalInstance = $uibModal.open({ 
      ariaLabelledBy: 'modal-title', 
      ariaDescribedBy: 'modal-body', 
      component: component, 
      size: size || 'md', 
      resolve: parseResolve(data) 
     }); 
    }; 

    // Parse the resolve object 
    function parseResolve(data) { 
     if (typeof data === 'string') { 
      return { 
       data: function() { 
        return data; 
       } 
      } 
     } 
     else if (typeof data === 'object') { 
      var resolve = {}; 
      angular.forEach(data, function(value, key) { 
       resolve[key] = function() { 
        return value; 
       } 
      }) 
      return resolve; 
     } 
    } 

}]); 

Когда usings струны

Шаблон:

<button ng-click="$modal.open('modalSomething', 'md', 'value'"> 
    Click 
</button> 

Компонент:

bindings: { 
    resolve: '@' 
} 

При использовании объектов

Шаблон:

<button ng-click="$modal.open('modalSomething', 'md', {key1: value1, key2: value2})"> 
    Click 
</button> 

Компонент:

bindings: { 
    resolve: '<' 
} 
-1

Я получил код ниже работы:

this.OpenModal = function() { 
     var modalInstance = $uibModal.open({ 
      url: "/name?parameter=" + $scope.Object.ParamValue, 
      templateUrl: 'views/module/page.html', 
      controller: myController 
     }); 
    } 
+0

вы должны включить дополнительную информацию о том, как ваш ответ решает проблему – Vokail

Смежные вопросы