読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

Iron-Routerを使っている場合の0.8.0へのアップグレードと0.7.1.2へのダウングレード

Meteor 0.8.0がリリースされましたね。
今回のアップデートはレンダリングエンジンが一新されて、テンプレートのrenderedハンドラでHTML以外の色々な更新をしていたアプリには大きな変更になります。
以前のバージョンのレンダリングエンジンは、基本的にリアクティブなデータが更新される度にHTMLを吐き出して更新するタイプでした。なので、renderedハンドラはその度に呼び出されていました。
今回のバージョンから、レンダリングエンジンがDOMベースになり、リアクティブなデータが更新されてもDOMそのものは必要とされる限り、そのまま再利用され、属性など部分部分のみが更新されます。それに伴い、renderedハンドラは初回にDOMが生成された時だけ呼び出されるようになりました。
従って、renderedハンドラでHTML以外のリアクティブな動作を記述していたアプリは(observeなど)別の方法に記述を変更する必要があります。

また、Iron-Routerを使ったマルチページアプリの場合、Meteor 0.7.1.2と0.8.0で使用できるIron-Routerが異なるため、0.8.0に移行する場合、Iron-Routerも更新する必要があります。

Iron-Routerも含めた、Meteor 0.8.0へのアップデート手順は以下の通りです。

meteor remove iron-router
rm -rf packages/iron-router
mrt update
mrt add iron-router

さて、旧バージョンに戻すには以下のようにします。

meteor remove iron-router
meteor remove braze-layout
rm -rf packages/iron-router
rm -rf packages/braze-layout
mrt update --release 0.7.1.2
mrt add iron-router --pkg-version 0.6.4

また、gitを使っている場合、
smart.jsonと.meteor/releaseも管理下に置いて、0.7.1.2版でのバージョンでsmart.jsonのiron-routerのところを

    "iron-router": {
      "version": "0.6.4"
    }

としておけば、バージョンの切り替えだけで、meteor 0.8.0と0.7.1.2の切り替えができます。

Error: must use ordered observe with skip or limit

Meteorを0.8.0にアップデートした際、テンプレートのrenderedの仕様が変わったので、前のコードと同様の振る舞いをさせるために、renderedの中でobserveを追加しました。すると、

Error: must use ordered observe with skip or limit

というエラーが出力されます。確かに、limitを使っているのですが、対象のカーソルはちゃんと***sort***しています。

ordered observeってカーソルにソートを使えという意味じゃないんですね。observeのコールバックに、xxxAt, xxxToを使え、という意味でした。