Rails バックエンド上に構築された ember アプリでは、常にこの問題が発生します。一連のグループを一覧表示する groups.hbs テンプレートがあります。グループをクリックすると、グループ テンプレートの横に group.hbs テンプレートが読み込まれ、URL が /groups/:group_id に変更されます。
ただし、戻るボタンと進むボタンをクリックするか、特定の :group_id を含む URL を手動で読み込もうとすると、グループ テンプレートのレンダリングに失敗し、コンソールが巨大なメッセージをスローします。
Uncaught TypeError: Object function () {
...
エラー。
group.js.coffee
App.Group = Ember.Object.extend()
App.Group.reopenClass
all: ->
App.ajax(
url: App.apiUrl('/groups')
).then (data) ->
console.log data
groups = []
for group in data.response
groups.addObject(App.Group.create(group))
console.log(groups)
groups
router.js.coffee
Mdm.Router.map ->
@resource 'groups', ->
@resource 'group', {path: "/:group_id"}
Mdm.Router.reopen
location: 'history'
スタンドアロンの ember アプリをビルドするときに、この問題を経験したことはありません。何が原因でしょうか?
編集
XHR リクエストを介して API からデータを取得していることを付け加えておきます。
編集2
GroupRoute を明示的に作成し、すべてのグループをロードしました。このコードは GroupsRoute と同じです。テンプレートはまだレンダリングされていませんが、そのエラーは発生しなくなりました。
グループルート
App.GroupRoute = Ember.Route.extend(model: ->
App.Group.all()
)
そして GroupsRoute:
App.GroupsRoute = Ember.Route.extend(model: ->
App.Group.all()
)
編集3
誰にも役立つ場合は、エラー全体を次に示します。
Uncaught TypeError: Object function () {
if (!wasApplied) {
Class.proto(); // prepare prototype...
}
o_defineProperty(this, GUID_KEY, undefinedDescriptor);
o_defineProperty(this, '_super', undefinedDescriptor);
var m = meta(this);
m.proto = this;
if (initMixins) {
// capture locally so we can clear the closed over variable
var mixins = initMixins;
initMixins = null;
this.reopen.apply(this, mixins);
}
if (initProperties) {
// capture locally so we can clear the closed over variable
var props = initProperties;
initProperties = null;
var concatenatedProperties = this.concatenatedProperties;
for (var i = 0, l = props.length; i < l; i++) {
var properties = props[i];
Ember.assert("Ember.Object.create no longer supports mixing in other definitions, use createWithMixins instead.", !(properties instanceof Ember.Mixin));
for (var keyName in properties) {
if (!properties.hasOwnProperty(keyName)) { continue; }
var value = properties[keyName],
IS_BINDING = Ember.IS_BINDING;
if (IS_BINDING.test(keyName)) {
var bindings = m.bindings;
if (!bindings) {
bindings = m.bindings = {};
} else if (!m.hasOwnProperty('bindings')) {
bindings = m.bindings = o_create(m.bindings);
}
bindings[keyName] = value;
}
var desc = m.descs[keyName];
Ember.assert("Ember.Object.create no longer supports defining computed properties.", !(value instanceof Ember.ComputedProperty));
Ember.assert("Ember.Object.create no longer supports defining methods that call _super.", !(typeof value === 'function' && value.toString().indexOf('._super') !== -1));
if (concatenatedProperties && indexOf(concatenatedProperties, keyName) >= 0) {
var baseValue = this[keyName];
if (baseValue) {
if ('function' === typeof baseValue.concat) {
value = baseValue.concat(value);
} else {
value = Ember.makeArray(baseValue).concat(value);
}
} else {
value = Ember.makeArray(value);
}
}
if (desc) {
desc.set(this, keyName, value);
} else {
if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) {
this.setUnknownProperty(keyName, value);
} else if (MANDATORY_SETTER) {
Ember.defineProperty(this, keyName, null, value); // setup mandatory setter
} else {
this[keyName] = value;
}
}
}
}
}
finishPartial(this, m);
delete m.proto;
finishChains(this);
this.init.apply(this, arguments);
} has no method 'find'
編集
戻るボタンをクリックするか、手動のURLを入力すると、IDに基づいてオブジェクトが見つかりませんでした。そこで、Group モデルに find() メソッドを追加しました。次のように見えません:
Mdm.Group = Ember.Object.extend()
Mdm.Group.reopenClass
all: ->
Mdm.ajax(
url: Mdm.apiUrl('/groups')
).then (data) ->
console.log data
groups = []
for group in data.response
groups.addObject(Mdm.Group.create(group))
console.log(groups)
groups
find: (group_id) ->
Mdm.ajax(
url: Mdm.apiUrl("/groups/#{group_id}")
).then (data) ->
renderTemplate: (data)
そして、私の GroupRoute は次のようになります。
Mdm.GroupRoute = Ember.Route.extend
model: (params) ->
console.log 'oh hai'
Mdm.Group.find(params.group_id)
コンソールで [戻る] ボタンをクリックすると、データが読み込まれますが、グループ テンプレートが group_id に関連付けられません。emberにこれを行うように指示するベストプラクティスの方法は何ですか?