如何在Ember中使用jsTree插件

我已经使用jsTree插件来渲染我的产品中的大量树节点。

现在我正在转移到Ember,需要在Ember中实现jsTree插件。

我写了一个Ember组件来使用jsTree来呈现我的文件夹结构。

我的组件:

<script type="text/x-handlebars" data-template-name="components/temp-tree"> <div id="treediv">Tree Data</div> </script> App.TempTreeComponent = Ember.Component.extend({ didInsertElement: function(){ var self = this; self.$().jstree({ 'plugins':["contextmenu", "dnd"], 'core' : { 'data' : [ 'Simple root node', { 'text' : 'Root node 2', 'state' : { 'opened' : true, 'selected' : true }, 'children' : [ {'text' : 'Child 1'}, 'Child 2' ] } ], 'check_callback': true } }) .on('rename_node.jstree', function(e, data) { alert('rename'); }) .on('delete_node.jstree', function(e, data) { alert('delete'); }); }, actions: {} }); 

JSBIN 演示

在我的组件中为树上所做的每个动作,jsTree触发一个事件的事件。

我曾经听过这些事件,并在必要时采取必要的行动。

基本上jsTree更新DOM并触发事件。

但是在Ember中,我们不会更新DOM,而是需要更新底层的MODEL,并通过两种方式进行数据绑定,DOM由Ember更新。

我在这里违反了Ember公约。

我正朝着正确的方向走吗?

有没有其他的方式来使用Ember的jsTree?

还是有没有像在Ember中可用的jsree像组件来渲染大量的所有function,如上下文菜单,拖放,search,独特的插件,checkbox,延迟加载,更新节点树节点?

您的问题的答案。

  1. 我正朝着正确的方向走吗? 。 您可以更好地模块化您的代码。
  2. 有没有其他的方式来使用Ember的jsTree? 。 我不知道你在想什么,但是你必须把jQuery接口包装进去。
  3. 有没有像jsTree的Ember扩展? 。 看看ember-cli-jstree或者ember-cli-tree 。

详细的回应

我们在我们的生产应用程序中使用Ember,我们必须扩展一些jQuery插件,并概述我们做的方式。

在一个插件的生命周期中有三个阶段,初始化有一些选项,用户交互触发事件和事件处理器操作状态。 目标是在遵循Ember约定的这些阶段上创build一个抽象层。 抽象不能使插件文档不可用。

 App.PluginComponent = Em.Component.extend({ /***** initialization *****/ op1: null, //default value op2: true, listOfAllOptions: ['op1', 'op2'], setupOptions: function() { //setup observers for options in `listOfAllOptions` }.on('init'), options: function() { //get keys from `listOfAllOptions` and values from current object //and translate them //to the key value pairs as used to initialize the plugin }.property(), /***** event handler setup *****/ pluginEvents: ['show', 'hide', 'change'], onShow: function() { //callback for `show` event }, setupEvents: function() { //get event names from `pluginEvents` //and setup callbacks //we use `'on' + Em.String.capitalize(eventName)` //as a convention for callback names }.on('init'), /***** initialization *****/ onHide: function() { //change the data //so that users of this component can add observers //and computed properties on it } }); 

你在正确的轨道上。

看到这个屏幕截图 ,类似的情况下,一个JQuery插件包装在一个Ember组件中,并带有数据绑定和事件触发。