Совместное использование $scope с cellTemplate с использованием ui.grid

Я использую ui.grid для получения списка частей. Я создал столбец, содержащий кнопку, которая запускает модальное окно. У меня проблемы с разделением области действия части, содержащейся в строке. Я хочу поделиться свойствами этой строки с кнопкой, которую я создаю с помощью cellTemplate. Затем я хочу поделиться $scope строки части с модальным, который он запустит.

Я немного озадачен тем, как это сделать на самом деле.

До сих пор я пытался

• Обтекание ng-repeat вокруг кнопки, на которую я хочу настроить таргетинг. Это работает, но делает приложение очень медленным. • Привязка данных к кнопке через ng-класс. Кажется, я не могу нацелиться на это правильно.

Как вы можете разделить $scope объекта, который вы получаете через $http.get, в ui.grid с элементами, которые вы создаете с помощью cellTemplate?


person fauverism    schedule 27.02.2015    source источник
comment
Затем я хочу поделиться $scope строки части с модальным, который он запустит. Вы хотите поделиться только данными фактической строки или фактическим объектом всей области видимости?   -  person ryanyuyu    schedule 02.03.2015
comment
данные фактической строки   -  person fauverism    schedule 02.03.2015
comment
Можете ли вы включить код, который запускает модальное окно?   -  person ryanyuyu    schedule 02.03.2015
comment
можете ли вы настроить плункер с минимальным кодом .. я сделал что-то подобное около года назад .. но не помню как, если бы вы могли настроить плунжер, я мог бы помочь   -  person harishr    schedule 02.03.2015


Ответы (3)


Отказ от ответственности. Я всегда использую синтаксис controllerAs, поэтому, если ссылка на контроллер в контексте HTML кажется вам странной, просто проигнорируйте эту часть и притворитесь, что вы настраиваете методы непосредственно в области видимости. Я также делаю все на Typescript, а не на Javascript, поэтому я собираюсь написать здесь соответствующие части кода. Их должно быть легко подключить к вашему приложению.

Ответ представляет собой комбинацию двух ответов, которые вы уже получили от Сунила и С. Бэгги.

Что вы хотите сделать, так это использовать функцию getExternalScopes() и прикрепить что-то к области HTML, где находится ваша сетка. То, что вы передали сетке, займет строку и вызовет ваше модальное всплывающее окно. См. ниже небольшое пояснение.

Ваш HTML -

<div ng-controller="MyController as myController">
  <div ui-grid="myController.GridObject" external-scopes="myController"></div>
</div>

Используя синтаксис controllerAs и сделав контроллер ссылкой во внешних областях, мы теперь можем получить доступ ко всему в нашем контроллере. Таким образом, мы можем вызывать в нем методы. Однако для этого мы должны использовать cellTemplate, что, похоже, вы уже знаете, как это сделать, и в этом cellTemplate у нас должно быть следующее:

ng-click="getExternalScopes().methodToLaunchModal()"

Теперь последняя часть подключения всего этого — запись метода methodToLaunchModal() в контроллер. Для этого мы заимствуем код из ответа С. Бэгги. Вот очень сокращенный контроллер с GridObject (тот самый, на который я ссылался из контроллера выше):

app.controller('MainCtrl', function($scope, $modal) {    
GridObject = {
   ... setup of all the other things
   columnDefs: [{ etc, etc, }, { etc, cellTemplate: '<div ng-click="getExternalScopes().methodToLaunchModal(row.entity)">whatever</div>' }]
};

methodToLaunchModal: function(row) {
   var modalInstance = $modal.open({
                        templateUrl: 'someTemplate',
                        controller: 'ModalController',                       
                        resolve: {
                            rowObject: function () { return row; }
                        }
                    });
   };
});

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

Извиняюсь, если какой-либо синтаксис немного не так.

person Paul    schedule 05.03.2015

Я использую директиву bootstrap $modal с таким кодом...

clickFunction: function (event, row) {
                    event.stopPropagation(); // prevents the current row from appearing as selected
                    var modalInstance = $modal.open({
                        templateUrl: 'views/modalcontent.tpl.html',
                        controller: 'ModalMessageController',
                        size: 'lg',
                        resolve: {
                            message: function () { return row.entity.serial_number; }
                        }
                    }
                );

Затем я просто ссылаюсь на {{message}} в шаблоне. Конечно, вы можете передать и любую другую часть данных.

person S. Baggy    schedule 02.03.2015

Вы можете получить доступ к строке и ее свойствам при выборе строки или ng-щелчок по этой строке с помощью externalscopes

ng-click="getExternalScopes().onRowClick(row)"

 onRowClick: function (row) {
                row.entity.Property1; /// and so on for all row properties
             }
person Sunil Vurity    schedule 27.02.2015
comment
Извини, Сунил, мне это не подходит. Я смог настроить таргетинг на свойство объекта, которое мне было нужно, с помощью id={{row.entity.serial_number}}. Теперь я пытаюсь поделиться областью действия строки с модальным, который я хочу запустить. - person fauverism; 27.02.2015
comment
не могли бы вы поделиться plunkr? - person Sunil Vurity; 27.02.2015