0

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にこれを行うように指示するベストプラクティスの方法は何ですか?

4

1 に答える 1

0

私はレール開発者ではありませんが、上記の単純なモデル/ルート設定に対してこのようなことを試してみてください

App.Group = Ember.Object.extend().reopenClass
  groups: []
  find: ->
    $.ajax
      url: "/api/groups/"
      type: "GET"
      cache: false
      dataType: "json"
      beforeSend: =>
        @groups.clear()
      success: (results) =>
        [@groups.addObject(App.Group.create(result)) for result in results]
      error: =>
        alert "error: failed to load the available groups"
    @groups

App.Router.map ->
  @resource "groups", path: "/", ->
    @route "group", path: "/:group_id"
于 2013-06-19T11:37:16.270 に答える