Angular directive content is not displayed unless you manually drag the page

I experience the following weird behavior in ui-bootstrap and angular 1.4. When I put the footable table footable inside a custom bootstrap called hpanel, footable initially takes up more space than the panel itself:

enter image description here

But if I change the screen size (for example, minimizing the developer toolbar here), the footable directive draws itself and fits into the panel:

enter image description here

It is important to note that I had similar problems with the angular-c3 diagram directives (they load incorrectly, exceeding the hpanel size, but behave perfectly when the page is resized), so this is probably not just a broken directive.

Have you seen something like this?

DETAILS:

Below is the HTML template, which is a non-functional part of the page. There we have hpanel and a table with angular-bootable directive ^ 1.0.3 is used inside it.

Here's the template ( toolList.html ):

 <div class="content"> <div class="row"> <div class="col-lg-12"> <div class="hpanel"> <div class="panel-heading"> <div class="panel-tools"> <a class="showhide"><i class="fa fa-chevron-up"></i></a> <a class="closebox"><i class="fa fa-times"></i></a> </div> Available tools. </div> <div class="panel-body"> <input type="text" class="form-control input-sm mb-md" id="filter" placeholder="Search in table"> <table id="example1" class="footable table table-stripped toggle-arrow-tiny" data-page-size="8" data-filter=#filter> <thead> <tr> <th data-toggle="true">Id</th> <th>Class</th> <th>Label</th> <th>Description</th> <th data-hide="all">Owner</th> <th data-hide="all">Contributor</th> <th data-hide="all">Inputs</th> <th data-hide="all">Outputs</th> <th data-hide="all">Base command</th> <th data-hide="all">Arguments</th> <th data-hide="all">Requirements</th> <th data-hide="all">Hints</th> </tr> </thead> <tbody> <tr ng-repeat="tool in vm.tools"> <td><a ui-sref="tool-detail({id: tool.id})">{{tool.id}}</a></td> <td>{{tool.tool_class}}</td> <td>{{tool.label}}</td> <td>{{tool.description}}</td> <td>{{tool.owner}}</td> <td>{{tool.contributor}}</td> <td>{{tool.baseCommand}}</td> <td>{{tool.arguments}}</td> <td>{{tool.requirements}}</td> <td>{{tool.hints}}</td> </tr> </tbody> <tfoot> <tr> <td colspan="5"> <ul class="pagination pull-right"></ul> </td> </tr> </tfoot> </table> </div> </div> </div> </div> </div> 

A suitable directive is intended to hide some columns of the table and show them when you click on a table row. It also provides pagination. This doesn't seem to work when the page loads, but when I resize the page and the screen size crosses the media type mark (so on a medium-sized screen it becomes a big screen in terms of bootstrap css), the pagination and column buttons are displayed, designed to hide, hidden.

This is how I import the footable directive into my main app.js module:

 require("footable/js/footable"); require("footable/js/footable.filter"); require("footable/js/footable.striping"); require("footable/js/footable.sort"); require("footable/js/footable.paginate"); require("footable/css/footable.core.css") require("angular-footable"); angular.module("app", [ ..., "ui.footable", ]) 

I use webpack to download all of these modules and bower to install dependencies.

hpanel is just a scss class, here is its definition:

 /* Panels */ .hpanel > .panel-heading { color: inherit; font-weight: 600; padding: 10px 4px; transition: all .3s; border: 1px solid transparent; } .hpanel .hbuilt.panel-heading { border-bottom: none; } .hpanel > .panel-footer, .hpanel > .panel-section { color: inherit; border: 1px solid $border-color; border-top: none; font-size: 90%; background: $color-bright; padding: 10px 15px; } .hpanel.panel-collapse > .panel-heading, .hpanel .hbuilt { background: #fff; border-color: $border-color; border: 1px solid $border-color; padding: 10px 10px; border-radius: 2px; } .hpanel .panel-body { background: #fff; border: 1px solid $border-color; border-radius: 2px; padding: 20px; position: relative; } .hpanel.panel-group .panel-body:first-child { border-top: 1px solid $border-color; } .hpanel.panel-group .panel-body { border-top: none; } .panel-collapse .panel-body { border: none; } .hpanel { background-color: none; border: none; box-shadow: none; margin-bottom: 25px; } .panel-tools { display: inline-block; float: right; margin-top: 0; padding: 0; position: relative; } .hpanel .alert { margin-bottom: 0; border-radius: 0; border: 1px solid $border-color; border-bottom: none; } .panel-tools a { margin-left: 5px; color: lighten($color-text, 20%); cursor: pointer; } .hpanel.hgreen .panel-body { border-top: 2px solid $color-green; } .hpanel.hblue .panel-body { border-top: 2px solid $color-blue; } .hpanel.hyellow .panel-body { border-top: 2px solid $color-yellow; } .hpanel.hviolet .panel-body { border-top: 2px solid $color-violet; } .hpanel.horange .panel-body { border-top: 2px solid $color-orange; } .hpanel.hred .panel-body { border-top: 2px solid $color-red; } .hpanel.hreddeep .panel-body { border-top: 2px solid $color-red-deep; } .hpanel.hnavyblue .panel-body { border-top: 2px solid $color-navy-blue; } .hpanel.hbggreen .panel-body { background: $color-green; color: #fff; border:none; } .hpanel.hbgblue .panel-body { background: $color-blue; color: #fff; border:none; } .hpanel.hbgyellow .panel-body { background: $color-yellow; color: #fff; border:none; } .hpanel.hbgviolet .panel-body { background: $color-violet; color: #fff; border:none; } .hpanel.hbgorange .panel-body { background: $color-orange; color: #fff; border:none; } .hpanel.hbgred .panel-body { background: $color-red; color: #fff; border:none; } .hpanel.hbgreddeep .panel-body { background: $color-red-deep; color: #fff; border:none; } .hpanel.hbgnavyblue .panel-body { background: $color-navy-blue; color: #fff; border:none; } .panel-group .panel-heading { background-color: $color-bright; } .small-header .hpanel { margin-bottom: 0; } .small-header { padding: 0 !important; } .small-header .panel-body { padding: 15px 25px; border-right: none; border-left: none; border-top: none; border-radius: 0; // background: $color-bright; } .panel-body h5, .panel-body h4 { font-weight: 600; } .small-header .panel-body h2 { font-size: 14px; font-weight: 600; text-transform: uppercase; margin: 0 0 0 0; } .small-header .panel-body small { color: lighten($color-text, 10%); } .hbreadcrumb { padding: 2px 0px; margin-top: 6px; margin-bottom: 0px; list-style: none; background-color: #fff; font-size: 11px; > li { display: inline-block; + li:before { padding: 0 5px; color: $color-navy-blue; } } > .active { color: lighten($color-text,20%); } } .wrapper { padding: 10px 20px; } .hpanel.collapsed .panel-body, .hpanel.collapsed .panel-footer { display: none; } .hpanel.collapsed .fa.fa-chevron-up:before { content: "\f078"; } .hpanel.collapsed .fa.fa-chevron-down:before { content: "\f077"; } .hpanel.collapsed.panel-collapse .panel-body { border-width: 0 1px 1px 1px; border-color: $border-color; border-style: solid; } .hpanel.collapsed .hbuilt.panel-heading { border-bottom: 1px solid $border-color; } body.fullscreen-panel-mode { overflow-y: hidden; } .hpanel.fullscreen { z-index: 2030; position: fixed; top: 0; left: 0; right: 0; bottom: 0; overflow: auto; margin-bottom: 0; } .hpanel.fullscreen .showhide { display: none; } .hpanel.fullscreen .panel-body { min-height: calc(100% - 77px); } 

Here is the tool.module.js file that animates the template:

 import angular from "angular"; var ToolResource = require("workflow/tool/tool.service"); class ToolListController { // @ngInject constructor($location, $stateParams, $state, tools) { this.$location = $location; this.$state = $state; this.$stateParams = $stateParams; this.tools = tools; } } // @ngInject function routesList($stateProvider) { $stateProvider.state("tool-list", { url: "/tool", parent: "layout", templateUrl: "/app/workflow/tool/toolList.html", controller: "ToolListController", controllerAs: "vm", data: { pageTitle: "Tool", pareDesc: "List of tools, available for workflow construction.", }, resolve: { ToolResource: "ToolResource", tools: function(ToolResource) { return ToolResource.query().$promise; } } }); } module.exports = angular.module("tool", []) .service('ToolResource', ToolResource) .controller('ToolListController', ToolListController) .config(routesList); 

tool.service.js :

 module.exports = function ToolResource($resource) { return $resource('/api/tool/:id', {id: '@id'}); } 

ANSWER: The community is amazing!

  • 1.5 years ago this directive was created
  • 12 days ago this error was fixed by Alexryan in his plug
  • 10 days ago I posted this question on StackOverflow
  • 8 days ago I put generosity on this question
  • 7 days ago ziscloud approved pull request
  • today, the bounty expired, and at the very last moment, Walfrath found out that the error was fixed.

So, yes, it was a mistake in the directive, which forced her to draw herself before receiving data from the server. With the fix, I just added the load-when="vm.tools" to the directive, and now it works fine.

Thanks, Alexryan, ziscloud, Walfrat and other commentators / responders. StackOverflow and Github just made my day!

+8
angularjs twitter-bootstrap angular-ui-bootstrap
source share
2 answers

Do you use this directive? https://github.com/ziscloud/angular-footable/blob/master/src/angular-footable.js . This is a self-made (which is not made by the editor amenable) directive, so it can be incorrectly implemented to work with Angularjs.

Looking at the code, it seems that you need to use the load-when attribute, if you want to delay initialization of the grid, even if you use the permission attribute in your state, it might be worth checking it. load-when should be an empty array at startup, will initiate the load after the array is no longer empty, but the bound data will not be used to initialize from what I saw.

Note: I couldnโ€™t install the correct plnkr myself, I donโ€™t know which version you are using (and which version of jQuery) and online links do not seem to be available.

+1
source share

Since you are loading data asynchronously (as mentioned in the comments), your html is displayed before it has any data in it. This means that the directive may be launched too early (if it tries to adapt based on data). As a rule, in this case, you will need to impose ng-if on the part of your html, which depends on the data loading (and will show a loading gif or something in its place). You can either run ng-if, if the data itself is specified, or save a separate logical value that you set after resolving the promise.

+1
source share

All Articles