読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。いや、まだ隊長と呼べるほどには至っていないけど、日々がんばります。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【Angular2】Converting circular structure to JSON

Angular2 JavaScript

FormGroupの値をそのままpostしようとしたら怒られた。

そういえば、jsonの値になっていないじゃないのか。と思い、コンバートしようとする。

stackoverflow.com

どうやら、そんなことはいらないらしい。

onSubmit(value: any): void {
  var url: string = '';
  this.datetimeFormService.postDatetime(url, value.value).subscribe(response => {
    console.log(response);
  });
}

FormGroup.valueでとれる。よかったよかった。

【Angular2】caused by: Error trying to diff '[object Object]'

JavaScript Angular2

ngForで、配列をイテレートしようとしたらエラーが。

ぐぐってみると

stackoverflow.com

Your extractData (and possibly also your HTTP API) is returning an object {} - ngFor requires an array [] to iterate.

Oh...

あ、てか、よく考えたら当たり前か。Objectはできないのね。みんなはちゃんと配列をわたしましょう。

【Angular2】caused by: Expression has changed after it was checked.

Angular2 JavaScript

以前から何度か苦しめられているエラー

github.com

This is not a bug, it's a feature of dev mode working as intended. Calling enableProdMode( ) - see updated plunk when bootstrapping the app prevents the exception from being thrown.

That said, it's being thrown for good reason: In short, after every round of change detection, dev mode immediately performs a second round to verify that no bindings have changed since the end of the first, as this would indicate that changes are being caused by change detection itself.

In your plunk, you have the binding [attr.spinner]=isLoading, and isLoading changes as a result of your call to this.load(), which occurs when ngAfterViewInit is fired, which happens as a part of the initial change detection turn. That in itself isn't problematic though - the problem is that this.load() changes a binding but does not trigger a new round of change detection, which means that this binding will not be updated until some future round of change detection.

どういうこっちゃ・・・?

とりあえず、ngAfterViewInitで、値を変えていることがダメっぽい。よくわからずに使うとダメってことね。

angular.io

lifecycleの一番最後にある、ngOnDestroy。こいつで値を変更するとうまくいきましたー。

理由は知らん。

【CakePHP3.x】query builderを使った複数条件のwhere

CakePHP PHP CakePHP3.x

便利になったんだろうけど、最初の壁は乗り越えづらい。

ちとハマったので、昔みたいに軽くメモ。

cakephp3.xはquery builderが一新されている。色々方法があるとは思うが、情報探すの大変。

一番はリファレンスを見ることがだが、基礎なので、応用を考えなければいけない。

「これって、こうだから、こんなこともいけるんじゃね?」みたいな発想(?)と試してみるべし。

話戻るけど、下記条件のqueryを実行したかった。

既存のデータから、とある日付 and とあるユーザー and (between 開始時刻 ユーザーが入力した情報1 and ユーザーが入力した情報2 or between 終了時刻 ユーザーが入力した情報1 and ユーザーが入力した情報2)

みたいなquery(わかりづらいな・・・)

1つの条件ならwhereを使えばすぐできそうだが、複雑になるとどうやるかわからなかった。

とりあえず、リファンレスに書いてあることを、試し試しでやっていたらできたのでメモ。@

<?php
// ...
    public static function existsDatetime($date, $userId, $start, $end) {
        $tableName = TableRegistry::get('table_name');
        $query = $tableName->find('all')
            ->where(function ($exp) use ($date, $start, $end, $userId) {
                // (between or between)を作っている
                $orConditions = $exp->or_(function ($or) use ($start, $end) {
                    return $or->between('start_time', $start, $end)
                        ->between('end_time', $start, $end);
                });
                // orは`$exp->or_()`で作らないといけないが
                // andはメソッドチェーンすればandとなる
                return $exp->add($orConditions)
                    ->eq('my_date', $date)
                    ->eq('user_id', $userId);
            });
        $count = $query->count();
        return !(boolean)$count;
    }
// ...

↑のコードはバリデーションクラスで使ったので、バリデーションのこともまたいつか書こうと思う。

無名関数を使えば、色々な表現方法を使ってqueryを生成できそうだ。便利。

これでできた。( ´ー`)フゥー...