2016-05-17 330 views
0

这可能是错误的方法,但基本上我想创建一个节点,其中一个下拉列表取决于配置节点值。节点Red在Admin UI中获取配置节点值

配置-的test.html

<script type="text/javascript"> 
    RED.nodes.registerType('test-config', { 
     category: 'config', 
     defaults: { 
      token: { value: '' } 
     } 
    }); 
</script> 

<script type="text/x-red" data-template-name="test-config"> 
    <div class="form-row"> 
     <label for="node-config-input-token"><i class="icon-tag"></i> Token</label> 
     <input type="text" id="node-config-input-token" placeholder="Token"> 
    </div> 
</script> 

配置,test.js

module.exports = function (RED) { 
    function TestConfig(config) { 
     RED.nodes.createNode(this, config); 
     this.token = config.token; 
    } 
    RED.nodes.registerType('test-config', TestConfig); 
} 

所以后来在新的节点,我想这样做:

test-node.html

<script type="text/javascript"> 
    RED.nodes.registerType('test-node', { 
     defaults: { 
      token: { value: '', type: 'test-config' }, 
      node: { value: '' } 
     }, 
     oneditprepare: function() { 
      var token = ??????; 
      var nodes = $('#node-input-node'); 

      reloadNodeSelect(); 

      function reloadNodeSelect() { 
       $.ajax({ 
        url: '--URL--' + token 
        success: function (res) { 
         nodes.html(''); 
         for (var i = 0; i < res.obj.length; i++) { 
          nodes.append($('<option></option>').attr('value', res.obj[i]).text(res.obj[i])); 
         } 
        } 
       }); 
      } 
     } 
    }); 
</script> 

<script type="text/x-red" data-template-name="temp-node"> 
    <div class="form-row"> 
     <label for="node-input-node"><i class="icon-tag"></i> Node</label> 
     <select type="text" id="node-input-node"></select> 
    </div> 
</script> 

这种情况是,有一个API使用令牌和Web请求获得节点列表,每个节点都有其自己的单个令牌,API需要针对该特定节点的请求。我还想列出每个节点还有几个附加子项,并允许用户选择给定的测试节点。每个节点的配置不同,使用这些附加选项创建配置节点似乎没有意义。

显然令牌可能只是提供作为测试节点上的文本字段,但这个想法是要限制重复的数量,使配置的目标用户更精简。

使用console.log(this);在oneditprepare()函数内部有一个token属性的值,但它是一个ID,它似乎指向配置节点。但我找不到一种方法来使用它来获得该节点的价值。

令牌: “5a1ab56c.5e478c”

我已经试过RED.nodes.getNode(),但这种方法只可在运行时API中:http://nodered.org/docs/api/runtime/api#getNode

谢谢!

回答

1

要做到这一点,你需要实现配置对话框HTML和运行端代码的NodeJS之间你自己的通信。执行此操作的正常方法是在nodejs代码中添加HTTP端点,并对此端点执行AJAX样式调用以填充下拉列表。

里有node-red-nodes Git仓库中一些类似的例子。一个例子是WeMo node

WeMoNG.js

... 
RED.httpAdmin.get('/wemoNG/devices', function(req, res) { 
    res.json(wemo.devices); 
}); 
... 

WeMoNG.html

... 
oneditprepare: function() { 
    var devices; 
    $.getJSON('wemoNG/devices', function(data) { 
     devices = data; 
     var devs = Object.keys(data); 
     if (devs.length !== 0) { 
      for (var d in devs) { 
       if (devs.hasOwnProperty(d)) { 
        $('<option/>',{ 
         'value': devs[d], 
         'text': data[devs[d]].name 
        }).appendTo('#node-config-input-device'); 
       } 
      } 
     } 
    }); 
    $('#node-config-input-device').change(function() { 
     var id = $("#node-config-input-device option:selected").first().val(); 
     if (devices) { 
      $('#node-config-input-type').val(devices[id].type); 
      $('#node-config-input-name').val(devices[id].name); 
     } 
    }); 
} 
...