0

我正在为Weebly创建拖动&拖放元素。 Weebly将每个元素包装在Backbone JS视图中,如explained here销毁事件或将外部DOM项链接到Backbone模型

// My js file. PlatformElement is a Weebly-controlled object exposed to me. 
PlatformElement.extend({ 
    initialize: function() { 
     // Weebly calls this method automatically at element creation time. 
     // This is where I add a new menu item to an external navigation menu. 
    } 
}); 

当骨干观点是initialize d,我一个新的DOM节点添加到外部导航菜单。我的问题从这里开始:当我的模型被销毁时,我创建的DOM节点仍然存在。

每次用户在网页设计器界面中重新配置我的元素时,Weebly会破坏/重新创建视图。我的外部菜单节点不会被破坏,因为它不是模型的一部分,并且我的JS没有意识到destory事件可以手动删除菜单节点。

当然,这意味着每个更改为我的元素创建另一个重复的菜单节点。

问题

  1. 是否有一个事件Weebly暴露给我,或者本地骨干功能暴露给我,让我知道,我的模型被销毁?
  2. 或者,有没有办法将我的外部菜单节点“链接”到我的模型,以便当我的模型被销毁时,菜单节点也是如此?

回答

2

Backbone确实提供了监听发生在Backbone对象(Model,View,Collection,...)的事件的方法。要收听破坏模型的情况下,你可以:

const model = new Model({/*...*/}); 

// solution 1 
model.on('destroy',() => console.log('model is destroyed')); 

// soluction 2 
const view = new View({/*...*/}); 
view.listenTo(model, 'destroy',() => console.log('model is destroyed')); 

model.destroy(); // this will trigger two callbacks above 
+1

['.listenTo' VS'.on'(https://stackoverflow.com/q/16823746/1218980) –

+0

@EmileBergeron我只是好奇,使用'on'和'listenTo'在答案中似乎是正确的。怎么了? –

+0

@TJ是的,但应该避免'on',我想指出。 –