Ember js:parentViewDidChange不';不要被触发

Ember js:parentViewDidChange不';不要被触发,view,ember.js,View,Ember.js,如果你有一个小游戏,其中图像必须被拖动到一个更大图像的右侧热点 这些小图像在containerView中,热点也是containerView。 当我将图像放置在热点上时,我在drag-n-drop mixin中使用以下代码在dom中移动图像: Player.Droppable = Ember.Mixin.create({ drop: function(event) { //get the view that was dragged var viewId =

如果你有一个小游戏,其中图像必须被拖动到一个更大图像的右侧热点

这些小图像在containerView中,热点也是containerView。 当我将图像放置在热点上时,我在drag-n-drop 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属性发生更改时调用。在我的情况下,它被改变了。这是一只虫子,还是我遗漏了什么


TIA

pushObject和removeObject是从Ember.ContainerView扩展的Ember.MutableArray Mixin继承的方法。如果查看Ember的ContainerView()源代码,您将看到ContainerView不会覆盖这些方法,因此它们只操作其子视图数组,而不是视图的父视图。 您应该在这里找到操作“\u parentView”属性的方法:()-在Ember.View的实现中。 因此,简而言之,使用:

  • removeChild而不是removeObject,从ContainerView中删除子视图
  • 如果要向ContainerView添加新的子视图,请创建ChildView+pushObject而不是“addObject”
示例代码:

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;
    }
});

这个问题是一个bug,在1.0.0决赛中得到了解决

如果您提供一个示例JSFIDLE(JSFIDLE.net),或者至少提到您使用的是什么版本的Ember,那就太好了,因为不同版本的API有时会有差异。嗨,乔治,我在Thx上放了一把小提琴作为输入!我已经更改了函数,但事件仍然没有被触发。当我记录parentView变量时,它会发生变化。我在这里拉了把小提琴:你说得对。。。它不会被调用,尽管它应该被调用。我建议您在中发布一个问题,并使用.observes('parentView')作为解决方法。(onParentViewChanged:function(){…}.observes('parentView'))