Ember.Select の contentBinding を動的に設定しようとしています。コンテンツは ajax 呼び出しからロードされます。didInsertElement
データが ajax 呼び出しから返される前に Select で呼び出されています。次に、エラーが発生します。
キャッチされないエラー: アサーションが失敗しました: 未定義のオブジェクトで「長さ」を指定して get を呼び出すことはできません。
データは最終的にロードされて設定されますが、最初のエラーによりdidInsertElement
、ページ上の後続の Ember.Selects の呼び出しが終了します。
didInsertElement メソッドを使用して selected.js をセットアップしています。didInsertElement 呼び出しが実行されないため、プラグインが正しくセットアップされません。
これが残り火のバグなのか、それとも私が何か誤解しているのかについて何か考えはありますか?
編集
エラーは、標準の Ember.Select ビューで発生します。
Ember.Select prompt="Select child" class="input-medium search" selectionBinding=controller.studentFilter contentBinding=controller.students optionValuePath=content.id optionLabelPath=content.name
controller.students は、ajax 呼び出しを介してロードされるデータへのバインディングです。
これにより、didInsertElement のそれ以上の処理が停止し、必要なインスタンスが呼び出されることはありません。これは後で DOM で発生し、次のようになります。
FP.ChosenMultipleSelect = Em.Select.extend
attributeBindings: [ 'multiple' ]
didInsertElement: ->
@._super()
@.$().chosen().change( (evt, data) =>
if data.selected
@get('controller.selectedStudents').pushObject(data.selected)
if data.deselected
remaining = @get('controller.selectedStudents').reject( (s) ->
s is data.deselected
)
)
selectionChanged: (->
@.$().trigger('liszt:updated')
).observes('selection')
エラーは次の場所で発生します。
viewCollection.forEach(function(v) {
v.transitionTo('inDOM');
v.propertyDidChange('element');
v.triggerRecursively('didInsertElement'); <<<<<<<<HERE ember.js line 17423
});
ありがとう、
マーティン
環境:
DEBUG: ------------------------------- ember.js:349
DEBUG: Ember.VERSION : 1.0.0-rc.3 ember.js:349
DEBUG: Handlebars.VERSION : 1.0.0-rc.3 ember.js:349
DEBUG: jQuery.VERSION : 1.8.3 ember.js:349
DEBUG: ----------------------------
スタック:
Uncaught Error: assertion failed: Cannot call get with 'length' on an undefined object. ember.js:52
Ember.assert ember.js:52
get ember.js:1996
Ember.Select.Ember.View.extend._changeSingle ember.js:22287
Ember.Select.Ember.View.extend._change ember.js:22238
Ember.Select.Ember.View.extend._triggerChange ember.js:22279
sendEvent ember.js:2432
Ember.Evented.Ember.Mixin.create.trigger ember.js:10398
Ember.CoreView.Ember.Object.extend.trigger ember.js:14348
superWrapper ember.js:1044
Ember.View.Ember.CoreView.extend.triggerRecursively ember.js:15842
superWrapper ember.js:1044
get ember.js:17424
Ember.EnumerableUtils.forEach ember.js:1526
ViewCollection.forEach ember.js:14440
insertViewCollection ember.js:17421
Ember.merge.ensureChildrenAreInDOM ember.js:17407
Ember.ContainerView.Ember.View.extend._ensureChildrenAreInDOM