• Как в reactjs задать background-image для элемента jsx через jss?

    0X12eb
    @0X12eb
    Есть баг в jss jsx:
    Путь к файлу нужно прописать, начиная с +1 уровня от текущего положения.
    ../../src/images/arrow.png
  • Какие есть библиотеки для печати документов в c#?

    0X12eb
    @0X12eb
    File.Copy("file_path", "\\myPrintServerName\myPrinterName")

    File.Copy не затрагивает кодировку, а просто передает пул байт, в данном случае в физический принтер - возможно дело в самих документах.
  • Как переделать скрипт js в jquery?

    0X12eb
    @0X12eb
    BedOmar: jquery это библиотека, а не язык - изучайте ванильный js.
  • Как переделать скрипт js в jquery?

    0X12eb
    @0X12eb
    Сергей: я думал что автор вопроса ищет online-сервис для конвертации js в jquery, врядли ему поможет запрос learn jquery в google (:
  • Какие есть библиотеки для печати документов в c#?

    0X12eb
    @0X12eb
    Если из БД, то аналогично:
    var byteArray= _service.GetFileContent();
    var printQueue = LocalPrintServer.GetDefaultPrintQueue();
    using (var job = printQueue.AddJob())
    using (var stream = job.JobStream)
    {
        stream.Write(byteArray, 0, byteArray.Length);
    }
  • Какие есть библиотеки для печати документов в c#?

    0X12eb
    @0X12eb
    stcmd04236: откуда данные берутся то?
    Если из стрима, то библиотеки никакие и не нужны:
    var file = File.ReadAllBytes(file_path);
    var printQueue = LocalPrintServer.GetDefaultPrintQueue();
    
    using (var job = printQueue.AddJob())
    using (var stream = job.JobStream)
    {
        stream.Write(file, 0, file.Length);
    }

    Или, если не хотите сами записывать стрим:
    File.Copy("file_path", "\\myPrintServerName\myPrinterName")
  • Как читать SQL-запрос?

    0X12eb
    @0X12eb
    Оптимус Пьян: Тогда хз что Вы спрашиваете вообще, изучайте теорию баз данных, если не понимаете как запросы читать.
    Для детального анализа, оптимизации и просмотра порядка выполнения запроса служат такие вещи, как explain или визуализация выполнения - Execution Plan.
  • Как автоматизировать "копипасту" во front-end Angular 4?

    0X12eb
    @0X12eb
    К сожалению, в Angular 2+ не предусмотрено механизма наследования компонентов.

    Если Вы этого не знаете - это не означает что этого нет...

    base component
    import { Component, Input, Output, EventEmitter } from '@angular/core';
    import { Employee } from './interfaces';
    
    @Component({
      selector: 'app-employee',
      template: ''
    })
    export class EmployeeComponent {
      @Input() employees: Employee[] = [];
      @Output() select = new EventEmitter();
    
      heading = 'Employees';
    
      selectEmployee(employee: Employee) {
        this.select.emit(employee);
      }
    }

    inheritance child component
    import { Component } from '@angular/core';
    import { EmployeeComponent } from './employee.component';
    
    @Component({
      selector: 'app-employee-list',
      template: `
        <h1>{{heading}}</h1>
        <ul>
          <li *ngFor="let employee of employees">
            {{employee.firstName}} {{employee.lastName}} <br>
            {{employee.email}} <br>
            <button (click)="selectEmployee(employee)">Select</button>
          </li>
        </ul>
      `
    })
    export class EmployeeListComponent extends EmployeeComponent {
      heading = 'Employee List';
    }

    another inheritance component
    import { Component } from '@angular/core';
    import { EmployeeComponent } from './employee.component';
    
    @Component({
      selector: 'app-employee-table',
      template: `
        <h1>{{heading}}</h1>
        <table>
          <tr>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Email</td>
          </tr>
          <tr *ngFor="let employee of employees">
            <td>{{employee.firstName}}</td>
            <td>{{employee.lastName}}</td>
            <td>{{employee.email}}</td>
            <td><button (click)="selectEmployee(employee)">Select</button></td>
          </tr>
        </table>
      `
    })
    export class EmployeeTableComponent extends EmployeeComponent { }

    using all
    <app-employee-list 
      [employees]="employees"
      (select)="selectEmployee($event)"></app-employee-list>
      
    <app-employee-table
      [employees]="employees"
      (select)="selectEmployee($event)"></app-employee-table>

    Всё прекрасно работает, хз почему Ваш Angular2+ не предусматривает наследование
    В качестве бонуса: plnkr
  • Почему не работает роут?

    0X12eb
    @0X12eb
    Дочерний компонент вместе с конфигом роута tabs.lookup должен находится внутри компонента вкладок, примерно так:
    tabs
    $routeConfig: [
          {path: '/:lookup_slug/...', name: 'Tabs', component: 'TabsComponent'}
    ]

    lookup
    $routeConfig: [
          {path: '/:record_id', name: 'Lookup', component: 'LookupComponent'}
    ]
  • [PrimeNg, Angular4] Несколько DataTable в нескольких вложенных TabView со множеством фильтров и бади темплейтами тормозит — как победить?

    0X12eb
    @0X12eb
    Прежде чем задавать такие вопросы - изучите компонентный подход в разработке SPA!
    Как уже говорили выше, вот пути для Вашего решения:
    1. Компонент на таблицу куда будут приходить инпутом все необходимые опции
    2. Роутинг на каждую вкладку (на внешние и на внутренние)
    3. Если не лень - написать свою таблицу с one-way bindings (там где можно) и наименьшим количеством хандлеров

    Даже только эти пункты позволят ускорить эту часть приложения на порядок!
  • Как в Angular2 навесить события и обращаться к атрибутам для html пришедшего из api?

    0X12eb
    @0X12eb
    Т.е. Вы хотите рабочие директивы ангуляра из темплейта который пришел по http ?
    Интересно узнать, какая задача вызвала столько такое странное требование.

    Решение есть:
    1. Делаем свою фабрику создания динамических компонентов:
    createNewComponent (tmpl:string) {
      @Component({
          selector: 'dynamic-component',
          template: tmpl,
      })
      class CustomDynamicComponent  implements IHaveDynamicData {
          @Input()  public entity: any;
      };
      // компонент для пришедшего темплейта
      return CustomDynamicComponent;
    }


    2. Инъекция компонента в NgModule:
    createComponentModule (componentType: any) {
      @NgModule({
        imports: [
          PartsModule,
        ],
        declarations: [
          componentType
        ],
      })
      class RuntimeComponentModule
      {
      }
      // Рантайм модуль на выходе для инъекции
      return RuntimeComponentModule;
    }

    3. Создаем фабрику компонентов и кешируем ее

    public createComponentFactory(template: string)
        : Promise<ComponentFactory<IHaveDynamicData>> {    
        let factory = this._cacheOfFactories[template];
    
        if (factory) {
            console.log("Module and Type are returned from cache")
    
            return new Promise((resolve) => {
                resolve(factory);
            });
        }
    
        // если неизвестный тип - создаем его
        let type   = this.createNewComponent(template);
        let module = this.createComponentModule(type);
    
        return new Promise((resolve) => {
            this.compiler
                .compileModuleAndAllComponentsAsync(module)
                .then((moduleWithFactories) =>
                {
                    factory = _.find(moduleWithFactories.componentFactories
                                    , { componentType: type });
    
                    this._cacheOfFactories[template] = factory;
    
                    resolve(factory);
                });
        });
    }


    4. Фрагмент кода как использовать вышеперечисленные шаги:
    // Здесь мы получаем фабрику (просто забираем ее из кеша)
      this.typeBuilder
          .createComponentFactory(template)
          .then((factory: ComponentFactory<IHaveDynamicData>) =>
        {
            // Создаем компонент и инъекцируем его (для получения ссылки на него)
            this.componentRef = this
                .dynamicComponentTarget
                .createComponent(factory);
    
            // инъекция @Inputs в инстанс компонента
            let component = this.componentRef.instance;
    
            component.entity = this.entity;
            //...
        });


    5. Ознакомьтесь с этим Ответ на похожий вопрос и подумайте еще раз - Вам действительно это нужно?

    6. Посмотрите на рабочий пример: Plnkr
  • Как правильно обработать массив объектов для md-table в общем компоненте?

    0X12eb
    @0X12eb
    Что за манипуляции могут проводиться над массивом объектов снаружи компонента, а не в самом DataSource?
    Прелоадер как раз и должен работать внутри DataSource:

    ts:
    export class CustomDataSource extends DataSource<T> {
      resultsLength: number = 0;
      isLoadingResults: boolean;
      isRateLimitReached: boolean;
    
      constructor(private _customService: CustomService,
                  private _sort: MdSort,
                  private _paginator: MdPaginator) {
        super();
      }
    
      connect(): Observable<T[]> {
        const displayDataChanges = [
          this._sort.mdSortChange,
          this._paginator.page,
        ];
    
        this._sort.mdSortChange.subscribe(() => {
          this._paginator.pageIndex = 0;
        });
    
        return Observable.merge(...displayDataChanges)
            .startWith(null)
            .switchMap(() => {
              this.isLoadingResults = true;
              return this._customService.getAllObjects(
                  this._sort.active, this._sort.direction, this._paginator.pageIndex);
            })
            .catch(() => {
              this.isRateLimitReached = true;
              return Observable.of(null);
            })
            .map(result => {
              this.isLoadingResults = false;
              return result;
            })
            .map(result => {
              if (!result) { return []; }
    
              this.isRateLimitReached = false;
              this.resultsLength = result.json().total_count;
    
              return result.json();
            });
      }
      disconnect() {}
    }


    html:
    <div class="container">
        <div class="custom-loader" *ngIf="dataSource.isLoadingResults || dataSource.isRateLimitReached">
            <md-spinner *ngIf="dataSource.isLoadingResults"></md-spinner>
            <div class="cstom-rate-limit-reached" *ngIf="dataSource.isRateLimitReached">
                Превышено время ожидания ответа.
            </div>
        </div>
        <md-table #table [dataSource]="dataSource" class="custom-table" mdSort mdSortActive="created" mdSortDisableClear mdSortDirection="asc">
            <ng-container cdkColumnDef="number">
                <md-header-cell *cdkHeaderCellDef> Number </md-header-cell>
                <md-cell *cdkCellDef="let row"> {{row.number}} </md-cell>
            </ng-container>
            <!-- Генерим свои строки -->
            <md-header-row *cdkHeaderRowDef="displayedColumns"></md-header-row>
            <md-row *cdkRowDef="let row; columns: displayedColumns;"></md-row>
        </md-table>
        <md-paginator [length]="dataSource.resultsLength" [pageSize]="30">
        </md-paginator>
    </div>