2015-11-19 2 views
1

Я хочу создать таблицу, содержащую динамический контент. При нажатии на элемент информация должна отображаться в следующей строке. Так я creatied следующее:Angularjs добавляет элемент в DOM при нажатии

<table ng-controller="TestCtrl"> 
    <tr ng-repeat-start="word in ['A', 'B', 'C']"> 
     <td><!-- Some Information, Image etc --></td> 
     <td ng-click="showDetails(word)">{{word}}</td> 
    </tr> 

    <!-- This is only visible if necessary --> 
    <tr ng-repeat-end ng-show="currentDetail == word"> 
     <td colspan="2" ng-attr-id="{{'Details' + word}}"></td> 
    </tr> 
</table> 

И у меня есть следующий JS код:

angular.module('maApp', []).controller("TestCtrl", function($scope, $document, $compile){ 
    $scope.showDetails = function(word){ 
     var target = $document.find("Details" + word); 

     //I checked it - target is NOT null here 

     //target.html("<div>Test</div>"); 
     //target.append("<div>Test</div>"); 
     var el = $compile("<div>Test</div>")($scope); 
     target.append(el); 

     //Show tr 
     $scope.currentDetail = word; 
    }; 
}); 

Я также попытался закомментированные решения выше, но ничего из этого не работает (ВУ показывает вверх, однако). Я думаю, что что-то не так с $document.find("Details" + word), но я не знаю что.

В конечном счете, я хочу добавить , а источник будет содержать word.

Кто-нибудь видит, что я делаю неправильно здесь?

ответ

1

Нет необходимости в необычных неангулярных манипуляциях с DOM: все, что вам нужно это.

HTML:

<table ng-controller="TestCtrl"> 
    <tr ng-repeat-start="word in ['A', 'B', 'C']"> 
     <td><!-- Some Information, Image etc --></td> 
     <td ng-click="showDetails(word)">{{word}}</td> 
    </tr> 
    <tr ng-show="currentDetail==word" ng-repeat-end> 
     <td colspan="2">Details {{word}}</td> 
    </tr> 
</table> 

JS:

angular.module('myApp', []).controller("TestCtrl", function($scope, $document, $compile){ 
    $scope.showDetails = function(word) { 
     $scope.currentDetail = word; 
    }; 
}); 

http://jsfiddle.net/HB7LU/20074/

+0

Большое спасибо за ваш ответ. Я знаю, что могу это сделать, но у меня есть одна проблема с этим ... (Вот почему я написал, что хочу добавить 'iframes'). Когда я делаю это так, у меня есть варианты iframes на моем веб-сайте, и он становится невосприимчивым ... –

+0

Если вы беспокоитесь о производительности, вероятно, вы должны использовать 'ng-if' вместо' ng-show'. С 'ng-if' связанные элементы не существуют в DOM, пока выражение не примет значение' true', по сравнению с 'ng-show', где оно просто использует CSS show/hide. Таким образом, только один iframe должен существовать одновременно с 'ng-if'. Код почти такой же, как и в предыдущем примере. http://jsfiddle.net/HB7LU/20075/ – Fissio

+0

Спасибо за хорошее Пояснение - +1 !! Он работает сейчас –

1

$ document.find в jqlite ограничивается только именем тега. Вы должны добавить jquery для чего-то большего. Посмотрите, что такое docs.

+0

Спасибо за ваш ответ. Я хотел бы выполнить это без jQuery. есть ли способ, чтобы сделать это? –

+0

BTW: Я также попытался: 'target = angular.element (document.getElementById (...))', который также не работал –

+0

Возможно, вы можете использовать 'ngSanitize' с' ngBind' или 'ngBindTemplate' или' ngBindHtml' https://docs.angularjs.org/api/ng/directive/ngBindHtml – koox00

1

вы все, что вам нужно встроенный в угловой уже не нужен Javascript вообще.

см this plunker example

<table style="width:100%;"> 
    <thead style="background-color: lightgray;"> 
     <tr> 
     <td style="width: 30px;"></td> 
     <td> 
      Name 
     </td> 
     <td>Gender</td> 
     </tr> 
    </thead> 
    <tbody> 
     <tr ng-repeat-start="person in people"> 
     <td> 
      <button ng-if="person.expanded" ng-click="person.expanded = false">-</button> 
      <button ng-if="!person.expanded" ng-click="person.expanded = true">+</button> 
     </td> 
     <td>{{person.name}}</td> 
     <td>{{person.gender}}</td> 
     </tr> 
     <tr ng-if="person.expanded" ng-repeat-end=""> 
     <td colspan="3">{{person.details}}</td> 
     </tr> 
    </tbody> 
    </table> 
+0

Спасибо за ваш ответ! К сожалению, у меня та же проблема, что и в ответе @ Fissio: я хочу добавить iframe и с тысячами iframes (в конце) сайт становится невосприимчивым ... –

+0

В этом разница, я использовал 'ng-if', а не' ng-show', который вообще не позволяет вашему содержимому показывать в DOM ... так что вы будете иметь только iframe, если элемент будет расширен. –

+0

Вы правы, я этого не видел. Отличный ответ тогда :-) Спасибо –

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