Hatena::ブログ(Diary)

q-yoshidaの日記

2018-01-12

CanActivateで取得したデータをResolveで返したい

| 19:39 |

次に遷移するコンポーネントの表示に必要なデータを、Resolveを使ってサーバーから取得するわけです。

しかし、サーバーでしかできない入力チェックとか、あるわけです。

なのでCanActivateでサーバーにアクセスするんですが、それならその時にデータも一緒に取ってきてResolveで返したいわけです。

ところが、こいつらの実行順はCanActivate→Resolveなわけです。

そしてcanActivate()の引数であるActivatedRouteSnapshotも、RouterStateSnapshotもResolveにデータを受け渡すような機能を持っていないのです。

CanActivateで適当なServiceにデータを保存して、Resolveでそれを返せばできますが・・・あまりスマートでない。


というわけで悩んだんですが、よく考えたら1個のクラスでCanActivateもResolveも実装してしまえばいいですね。単純。

@Injectable()
export class SomeComponentGuard implements CanActivate, Resolve<Data> {

  private data: Data;
  
  constructor(
    private service: ServerAccessService
  ) { }
  
  canActivate(
      next: ActivatedRouteSnapshot,
      state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
    return this.service.getData(next.queryParams).map(
      data => {
        this.data = data;
        return true;
      }
    ).catch(e => {
      return Observable.of(false);
    });
  }
  
  resolve(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): Data | Observable<Data> | Promise<Data> {
    return data;
  }

}

2017-12-27

AngularでRouterのrunGuardsAndResolversが効かない

15:12 |

開発環境では効いていたrunGuardsAndResolversが、ビルドしてサーバーに上げたら効かなくなった。

AOTのせいかも……と思って下記個所を修正したらビンゴだった。

こういう書き方はだめらしい。

const ROUTES: Routes = [
  // たくさんのルーティング設定
];

ROUTES.forEach(route => {
  route.runGuardsAndResolvers = "always";  // ここがだめ 各ルーティング設定にひとつひとつ設定すべし
});

export const XXX_ROUTES = RouterModule.forChild(ROUTES);

2017-12-20

java.lang.ClassCircularityError: java/util/logging/LogRecord

20:38 |

java.util.Loggerをslf4jにブリッジするために、下記設定をすることは色んなサイトに書いてある。

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
  <resetJUL>true</resetJUL>
</contextListener>

が、この設定をすると下記のエラーが発生してしまう。

java.lang.ClassCircularityError: java/util/logging/LogRecord
	at org.slf4j.bridge.SLF4JBridgeHandler.getSLF4JLogger(SLF4JBridgeHandler.java:198)
	at org.slf4j.bridge.SLF4JBridgeHandler.publish(SLF4JBridgeHandler.java:293)
	at java.util.logging.Logger.log(Logger.java:738)
	at java.util.logging.Logger.doLog(Logger.java:765)
	at java.util.logging.Logger.logp(Logger.java:931)
	at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:180)
	at org.apache.juli.logging.DirectJDKLog.debug(DirectJDKLog.java:103)
	at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:355)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:161)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:630)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:351)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:485)

このエラーはlogback.xmlに下記設定を施すことで解決できた。

<logger name="org.apache" level="INFO">

参考:

https://stackoverflow.com/questions/2656565/classcircularityerror-when-running-tomcat-6-from-eclipse

2017-09-28

wkhtmltopdfでChart.jsのチャートが出ない

19:30 |

wkhtmltopdf 0.12.3

Chart.js 2.7.0

Shark.PdfConvert 1.0.1

Windows7


色々調べた結果、new Chart()実行時にJavascriptでこけていることがわかった。

こけている原因は、Chart.jsが使用しているFunction.prototype.bindがundefinedであること。

だからFunction.prototype.bindを定義してあげれば直るはず。

だが実際にやってみると下記のエラーが発生する。

Unhandled Exception: System.IO.InvalidDataException: WkHTMLToPdf conversion of HTML data failed. Output: 
WkHTMLToPdf exited with code -1073741819.

色々試行錯誤して、wkhtmltopdfのバージョンを0.12.3.2に下げればFunction.prototype.bindを定義してもエラーにならないことがわかった。

だが理由はまったくわからない。

ちなみに0.13.0-alpha3もだめ。

2017-02-18

.vimrcに設定を追加したら奇妙な動きをする

18:22 |

Windowsgvimを使っているのだが、.vimrcに下記の設定をしたところ奇妙な動きをするようになった。

"表示行通りに移動
noremap j gj
noremap k gk 

j → 表示行で2行ずつ移動

k → 動かない


わけがわからず設定をあれこれいじっているうちに、追加した分の設定の改行コードがCRLFになっていることに気づいた。

ぐぐって出たサイトからコピー&ペーストしたせいか。

そこで改行コードをLFに統一したところ、期待したとおりの動きになった。