Node-red自定义节点,如何使用节点属性?
Node-red custom node, How to use the node property?
我正在尝试创建自定义节点,我正在尝试一个非常简单的节点。我需要使用节点的 属性,用户从下拉列表中选择的值,send/output 属性 和 msg.payload 的值。
这是调试选项卡中的错误消息:
4/7/2017 21.45.06node: lolo
msg : error
"ReferenceError: $ is not defined"
这是期望的输出:
"ppp[lolo:m2]"
我删除了js文件中带$的行,因为它不识别jQuery。我改用这个
msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]";
但在输出中选项值未定义,而不是 select 下拉列表中的选项之一的值:
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);
};
请务必记住,Node-RED 节点的 2 个独立部分 运行 位于非常不同的位置:
.js
文件 运行 在 Node-RED 的后端服务器端
- Web 浏览器中的
.html
文件 运行 正在访问用户客户端计算机上的 Node-RED 编辑器。
这意味着 .js
文件无法直接访问编辑器配置中的字段 window 并且也无法访问 jquery ($
)表示法。
部署流程时,所有配置变量都会在 config
变量中传递到后端。您已经在以下位置访问过该值:
var axis = config.axis;
所以您可以只使用 axis
变量而不是 var x = $("#node-input-axis").val();
。
您不能使用 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);
};
我正在尝试创建自定义节点,我正在尝试一个非常简单的节点。我需要使用节点的 属性,用户从下拉列表中选择的值,send/output 属性 和 msg.payload 的值。
这是调试选项卡中的错误消息:
4/7/2017 21.45.06node: lolo
msg : error
"ReferenceError: $ is not defined"
这是期望的输出:
"ppp[lolo:m2]"
我删除了js文件中带$的行,因为它不识别jQuery。我改用这个
msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]";
但在输出中选项值未定义,而不是 select 下拉列表中的选项之一的值:
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);
};
请务必记住,Node-RED 节点的 2 个独立部分 运行 位于非常不同的位置:
.js
文件 运行 在 Node-RED 的后端服务器端
- Web 浏览器中的
.html
文件 运行 正在访问用户客户端计算机上的 Node-RED 编辑器。
这意味着 .js
文件无法直接访问编辑器配置中的字段 window 并且也无法访问 jquery ($
)表示法。
部署流程时,所有配置变量都会在 config
变量中传递到后端。您已经在以下位置访问过该值:
var axis = config.axis;
所以您可以只使用 axis
变量而不是 var x = $("#node-input-axis").val();
。
您不能使用 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);
};