ДОВІДНИК З NODE-RED українською мовою
Деякі приклади використання AngularJS з Node-RED Dashboard. Не всі функції Angular доступні за допомогою Dashboard
To access the msg
object from within a client Angular script. Put this into a Dashboard Template node:
При використанні Dashboard сервер Node-RED (back end) надсилає дані через Socket.IO до клієнтського браузера (front end). Це відбувається у вигляді об’єкта msg
. у подібній формі до повідомлення, яке протікає через решту Node-RED.
Щоб отримати доступ до об’єкта msg
з клієнтського сценарію Angular помістіть це у вузол Dashboard Template:
<div ng-bind-html="msg.payload"></div>
<script>
//console.dir(scope) // це також працює
//console.dir(scope.msg) // це ні, бо scope.msg ще не існує
// Lambda function для доступу до Angular Scope
;(function(scope) {
//console.log('--- SCOPE ---')
//console.dir(scope) // це працює, але Ви можете отримати його тільки один раз (при запуску)
//console.dir(scope.msg) // не працює бо scope.msg ще не існує
//Щоб отримати нові вхідні повідомлення, потрібно використовувати $watch
scope.$watch('msg.payload', function(newVal, oldVal) {
console.log('- Scope.msg -')
console.dir(scope.msg)
})
})(scope)
</script>
Це показує, як налаштувати деякі кнопки та віджет повзунка, які надсилають дані назад до Node-RED. Як завжди, додайте цей код до вузла Dashboard Template.
<div></div>
<md-button ng-click="send({payload: 'Hello World'})">
Натисни мене для відправки hello world
</md-button>
<md-slider ng-model="msg.payload" ng-change="send(msg)"></md-slider>
<div flex layout="row" layout-align="space-around center">
<md-button ng-repeat="b in buttons" class="md-icon-button" ng-click="click(b)">
<ng-md-icon icon=""
ng-style="{color: msg.payload[b.payload]?b.color2:b.color}"></ng-md-icon>
</md-button>
</div>
<script>
scope.buttons = [{
icon: 'pause', color: 'black',
icon2: 'play_arrow', color2: 'red',
payload: 'play',
}, {
icon: 'alarm', color: 'black',
icon2: 'alarm', color2: 'red',
payload: 'alarm',
}];
scope.click = function(b) {
if (!this.msg) this.msg = {};
if (!this.msg.payload) this.msg.payload = {};
this.msg.payload[b.payload] = !this.msg.payload[b.payload];
this.send(this.msg);
}.bind(scope);
</script>
За допомогою Angular та Dashboard Template ми можемо оновити інтерфейс користувача безпосередньо з вхідного повідомлення, зробивши розрахунок після отримання повідомлення або викликаючи функцію.
<h1>Msg Topic: </h1>
<h2>msg.payload.a</h2>
<div ng-bind-html="msg.payload.a"></div>
<h2>Розраховується після отримання msg</h2>
<div></div>
<h2>Викликати функцію по кліку</h2>
<div ng-click="click(b)">Клікни мен для зміни числа</div>
<div></div>
<script>
// Lambda function для доступу до Angular Scope
;(function(scope) {
//Щоб отримати нові вхідні повідомлення, потрібно використовувати $watch
scope.$watch('msg.payload', function(newVal, oldVal) {
console.log('- Scope.msg -')
console.dir(scope.msg)
scope.myCalc = scope.msg.payload.b * 2
})
// Функція спрацьовує по кліку на div
scope.click = function(b) {
if ( ! scope.myNum ) scope.myNum = 0
scope.myNum++
}
})(scope)
</script>
<div>
<md-datepicker ng-model="myDate" md-placeholder="Enter date" ng-change="send({payload: myDate})"></md-datepicker>
</div>
Використовуйте цей код у Dashboard Template для візуалізації повідомлення msg.payload, що містить HTML.
<div ng-bind-html="msg.payload"></div>
Angular має властивість ng-repeat
, що дозволяє нам проходити через масив (або об’єкт) для динамічного створення списку, таблиці тощо.
<div ng-repeat="(key, value) in myObj"> ... </div>
Якщо можливо, використовуйте IіD для відстеження, оскільки це допомагає Angular знати, коли щось потребує оновлення:
<div ng-repeat="(key, value) in myObj track by myObj.id"> ... </div>
Ви також можете використовувати елементи ng-repeat-start
і ` ng-repeat-end` для обертання вмісту.
Докладніше див. у Angular v1 docs for ngRepeat .
Робочий приклад, використовуйте це у вузлі Dashboard Template:
<table>
<tr ng-repeat="(key, value) in msg.payload">
<td></td>
<td></td>
</tr>
</table>
Якщо ви хочете надіслати дані через вузол Node-RED Template, перш ніж надсилати його на вузол Dashboard Template, ви побачите це, оскільки обидва використовують однакові роздільники (подвійні фігурні дужки). Тож вам потрібно змінити роздільники у Dashboard Template.
<!DOCTYPE html>
<html ng-app="ngApp">
<head></head>
<body ng-controller="ngCtrl">
<h1>Topic: {[{topic}]}</h1>
<pre>
{[{payload | json }]}
</pre>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.4.12/angular.min.js"></script>
<script>
var ngApp = angular.module('ngApp', []);
ngApp.config(function($interpolateProvider) {
$interpolateProvider.startSymbol('{[{');
$interpolateProvider.endSymbol('}]}');
});
ngApp.controller('ngCtrl', ['$scope', function($scope) {
// Need to wrap with TRY in case not valid JSON
$scope.payload = JSON.parse(decodeEntities(''));
$scope.topic = '';
}]);
function decodeEntities(encodedString) {
var textArea = document.createElement('textarea');
textArea.innerHTML = encodedString;
return textArea.value;
}
</script>
</body>
</html>