Ember js:parentViewDidChange不';不要被触发
如果你有一个小游戏,其中图像必须被拖动到一个更大图像的右侧热点 这些小图像在containerView中,热点也是containerView。 当我将图像放置在热点上时,我在drag-n-drop mixin中使用以下代码在dom中移动图像: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 =
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属性发生更改时调用。在我的情况下,它被改变了。这是一只虫子,还是我遗漏了什么
TIApushObject和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'))