节点红色自定义节点,如何使用节点属性?

时间:2017-07-05 12:12:50

标签: node-red

我正在尝试创建自定义节点,我正在尝试非常简单的节点。我需要使用节点的属性,即用户从下拉列表中选择的值,使用msg.payload发送/输出该属性的值。

这是调试选项卡中的错误消息:

4/7/2017 21.45.06node: lolo
msg : error
"ReferenceError: $ is not defined"

这是所需的输出:

“ppp [lolo:m2]”

我删除了$ in js文件中的行,因为它无法识别jQuery。我改用

msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]";

但是在输出中,选项值是未定义的,而不是选择下拉列表中的一个选项的值:

5/7/2017 11.34.22node: 5aa4aa59.f9fa04
msg.payload : string[19]
"ppp[lolo:undefined]"

这是节点的html文件:

<script type="text/javascript">
    RED.nodes.registerType('Hello World',{
        category: 'Demo',
        color: '#ffaaaa',
        defaults: {
            name: {value:""},
		axis:{value:""}
        },
        inputs:1,
        outputs:1,
        icon: "face.png",
        label: function() {
            return this.name||"Hello World";
        }
    });
</script>
<script type="text/x-red" data-template-name="Hello World">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
    <div class="form-row">
        <label for="node-input-topic"><i class="icon-tag"></i> Topic</label>
        <input type="text" id="node-input-topic" placeholder="Topic">
    </div>
	<div class="form-row">
        <label for="node-input-axis"><i class="icon-tag"></i> Motor</label>
        <!--<input type="text" id="node-input-axis" placeholder="axis">-->
		<select value="" id="node-input-axis" placeholder="axis">
            <option value="m1">m1</option>
            <option value="m2">m2</option>
            <option value="m3">m3</option>
            <option value="m4">m4</option>
        </select>
    </div>
</script>
<script type="text/x-red" data-help-name="Hello World">
    <p>A node that increments every time a new message is received and sends Hello World in return.<br/>
    </p>
</script>

这是节点的js文件:

module.exports = function(RED) {
    function helloWorld(config) {
        RED.nodes.createNode(this,config);
        //var context = this.context();
		var nodeName = this.name;
		var axis = config.axis; 
        var node = this;
		//var $ = require('jQuery');
		var x = $("#node-input-axis").val();
        this.on('input', function(msg) {
			msg.payload = msg.payload +"[" + nodeName+":"+ x +"]";
			//{payload: nodeName+" "+node.axis};
			node.send(msg);
        });
		//console.log(value);
    }
    RED.nodes.registerType("Hello World",helloWorld);
};

1 个答案:

答案 0 :(得分:3)

重要的是要记住Node-RED节点的2个独立部分在不同的位置运行:

  • .js文件在Node-RED的后端服务器端运行
  • .html文件在访问用户客户端计算机上的Node-RED Editor的Web浏览器中运行。

这意味着.js文件无法直接访问编辑器配置窗口中的字段,也无法访问jquery($)表示法。

部署流时,所有配置变量都会传递到config变量的后端。您已在以下位置访问该值:

var axis = config.axis; 

所以var x = $("#node-input-axis").val();可以使用axis变量而不是node.axis

您无法使用config.axis,因为在尝试使用this.axis之前未将node.axis绑定到module.exports = function(RED) { function helloWorld(config) { RED.nodes.createNode(this,config); //var context = this.context(); var nodeName = this.name; this.axis = config.axis; var node = this; this.on('input', function(msg) { msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]"; //{payload: nodeName+" "+ node.axis}; node.send(msg); }); //console.log(value); } RED.nodes.registerType("Hello World",helloWorld); }; matrix((length(M) - rank(M))/length(M), nrow=nrow(M), ncol=ncol(M))

e.g:

length(M)