2016-05-17 91 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); 
     } 
    }); 
} 
...