0

大きな画像の正しいホットスポットに画像をドラッグする必要がある小さなゲームがある場合。

小さな画像は containerView 内にあり、ホットスポットも ContainerView です。ホットスポットに画像をドロップすると、ドラッグ アンド ドロップ mixin で次のコードを使用して、画像を dom に移動します。

Player.Droppable = Ember.Mixin.create({
    drop: function(event) {
        //get the view that was dragged
        var viewId = event.originalEvent.dataTransfer.getData('Text');
        var view = Ember.View.views[viewId];

        //log the parent-view: App.AnswerListView
        console.log(view.get('parentView').constructor);

        //detach the view from the original containerView
        var parentView = view.get('parentView');
        parentView.removeObject(view);

        //attach it to the hot-spot-containerview
        this.addObject(view);

        //logging this gives a different result: App.HotspotView
        console.log(view.get('parentView').constructor);

        event.preventDefault();
        return false;
    }
});

ドラッグしているビューは App.AnswerView です。私がドキュメントから期待しているのは、 AnswerView の関数parentViewDidChangeがトリガーされることですが、それは起こりません:

App.AnswerView = Ember.View.extend(App.Draggable, {
    templateName: "answer",
    classNameBindings: [':answer', 'this.content.isSelected:selected'],
    click: function(evt){
        this.get('controller').send('answerClicked', this.content);
    },
    parentViewDidChange: function(){
        this.get('controller').send('answerMoved', this.content);
    },
});

ドキュメントは言う:parentViewプロパティが変更されたときに呼び出されます。私の場合は変更されています。これはバグですか、それとも何か不足していますか?

ティア

4

2 に答える 2

1

この問題はバグであり、1.0.0 最終版で解決されました https://github.com/emberjs/ember.js/issues/2423

于 2013-09-17T13:34:26.087 に答える
0

pushObject と removeObject は、Ember.MutableArray Mixin から継承され、Ember.ContainerView が拡張するメソッドです。ContainerView の Ember のソース コード ( https://github.com/emberjs/ember.js/blob/v1.0.0-rc.2/packages/ember-views/lib/views/container_view.js#L15 )を見ると、 ContainerView はこれらのメソッドをオーバーライドしないため、ビューの親ビューではなく、その childViews 配列のみを操作することがわかります。代わりに、「_parentView」プロパティを操作するメソッドをここで見つける必要があります。 .js#L2018 ) - Ember.View の実装内。要するに、次を使用します。

  • ContainerView から子ビューを削除するには、removeObject の代わりに removeChild
  • 新しい子ビューを ContainerView に追加する場合は、「addObject」の代わりに createChildView + pushObject を使用します。

コード例:

Player.Droppable = Ember.Mixin.create({
    drop: function(event) {
        //get the view that was dragged
        var viewId = event.originalEvent.dataTransfer.getData('Text');
        var view = Ember.View.views[viewId];

        //log the parent-view: App.AnswerListView
        console.log(view.get('parentView').constructor);

        //detach the view from the original containerView
        var parentView = view.get('parentView');
        parentView.removeChild(view);

        //attach it to the hot-spot-containerview
        this.createChildView(view);
        this.pushObject(view);

        //logging this gives a different result: App.HotspotView
        console.log(view.get('parentView').constructor);

        event.preventDefault();
        return false;
    }
});
于 2013-04-08T10:49:10.103 に答える