日々精進

新しく学んだことを書き留めていきます

AngularJSでスクロール領域内を更新したらスクロール位置が変わってしまう問題

解決が結構面倒だった。 まずng-repeatでスクロール領域内を更新していたので、更新完了イベントが必要だった。 以下のdirectiveを定義してng-repeat完了イベントを定義した。

module sample {
  'use strict';

  /**
   * ng-repeat処理完了イベントを発行するDirective
   */
  export class OnFinishRenderDirective implements ng.IDirective {
    public priority: number = -1;
    public restrict: string = 'A';
    public scope: any = {};
    private timeoutService: angular.ITimeoutService;
    public link: Function;

    /* @ngInject */
    constructor($timeout: angular.ITimeoutService) {
      this.timeoutService = $timeout;
      this.link = (scope: ng.IScope, element: ng.IAugmentedJQuery, attr: ng.IAttributes): any => {
        if ((<angular.IRepeatScope>scope.$parent).$last === true) {
          this.timeoutService(function() {
            scope.$emit('ngRepeatFinished');
          }, 0);
        }
      };
    }


    /* @ngInject */
    public static init($timeout : angular.ITimeoutService): any {
      return new OnFinishRenderDirective($timeout);
    }
  }
}

このon-finish-renderディレクティブはng-repeatを付けているタグに付ける。 後はスクロール領域のスクロールイベントで今表示中の位置を保存し、OnFinishRenderイベントでその値をスクロール位置に設定する。 あるあるな問題だろうからもっと楽な解決策ありそうだけどな。。

参考:

スクロール領域内にfloatでdivを横に並べるとスクロールせず折り返してしまう問題

□がDIVで|が親DIVのEdgeとすると、以下のようにしたい。

|□□□□|

親DIVの幅は固定で、中のDIVの数が増えたら横スクロール出来ようにしたい。 が、中のDIVをfloatを使って横並びにしていたので中のDIVを増やすと以下のように折り返してしまう。

|□□□□|
|□   |

こういう場合、中のDIV全体を囲むDIVをwidth固定で定義すればよい。 中のDIVの数が動的に変わる場合、その数に応じて囲むDIVのwidthを変更しないといけないのでng-styleを使って動的に計算する必要がある。

AngularJSでDivの高さ・幅などを動的に計算する

CSSのcalc関数で実行時に計算した値をwidthなどにセットすることはできるが、 子要素の数によって親要素のwidthを変更したい場合などは子要素の数がCSSから取れないので計算できない。(子要素の数を知る方法あれば教えて下さい。。) 以下のようにしてng-styleを使えばControllerで計算した値を設定できる。

<div ng-style="{width: controller.getWidth()}">

参考:

http://wordpress.honobono-life.info/code/angularjs%E3%81%AEng-class%E3%80%81ng-style%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6css%E3%82%92%E8%A8%AD%E5%AE%9A/

Windowsでリモートデスクトップでログイン中のマシンを再起動する方法

リモートデスクトップでログイン中に、スタートメニューをクリックして通常再起動メニューが出るところをクリックしても、切断しか出ない。 コマンドプロンプトで以下コマンドを実行すると再起動できる。 shutdown -r

なんで通常と同じ手順で再起動できないんだろ。。

参考:

windows10で突然ブルースクリーンになり、それ以降起動中にブルースクリーンになって起動しなくなった

起動に失敗したときのメッセージは「INACCESSIBLE BOOT DEVICE」とか。毎回変わる。 「INACCESSIBLE BOOT DEVICE」が出た時はBIOS設定を見てみると確かにOSドライブが起動ディスクから外れているので入れてやると、 また別のエラーがでるという謎の状態。

原因が全然分からず困ったが、ブルースクリーンなどの致命的なエラーが出た時はメモリ故障のことが多いという経験則に則ってメモリを一つ外して起動してみると、 無事起動出来た。 突然メモリがぶっ壊れることってたまにあるんだよな。。

参考:

PCからiPhone内の写真を削除しようとすると「この項目を削除するアクセス許可がありません」エラー

iPhoneの設定のiCloudの「写真」をオフにすると削除出来るようになった。 なぜこれで削除できるようになるかはよくわからないが、iCloudが有効だと写真を削除するとiCloud上の写真も削除されるから削除権限を厳しくしてるのかも?

参考: