在Angular.js中更新蓝牙低功耗设备属性的正确方法是什么?

时间:2016-11-03 21:08:08

标签: html angularjs bluetooth-lowenergy

我想知道有更好的方法来实现我将在下面描述的内容。

我们说我有一些相同的蓝牙LE设备,我加载到一个阵列中:

var bleDevices = [];

有些指标和开关需要使用上面的属性在用户界面上更新。设备连接到DOM,如下所示:

$scope.devices = getAllDevices();

每个设备都有一堆与之关联的属性,它们代表物理外围设备的当前状态。

onDeviceDiscoveryCallback(device){

   addDeviceToArray({

    /** The first three properties are returned by the callback */
    name:device.name,
    rssi:device.rssi,
    id:device.id

    /** The rest of the object contains developer defined properties */
    acceleration:null,
    temperature:null,
    brightness:null,
    .
    .
    .

  })
 }

使用上述设备填充阵列后,我将连接到设备。 onConnect回调返回一个设备对象,我用它来从数组中获取设备的ID:

onConnectCallback(device){

 var arrayDevice = getDeviceByID(device.id);

}

然后我按照需要在各个工厂中按需要更新属性:

var updateAcceleration = function(arrayDevice){

  arrayDevice.acceleration = someValue;
};

这种情况发生在工厂,所以$ scope不可用。相反,我在任何地方使用$ rootScope似乎都可以工作但由于应用程序非常庞大而且非常复杂,部分原因在于我将模型绑定到接口的方式。

我的问题是,有没有更好的方法来通过拥有一个中央BLE设备对象来更新我的用户界面?

非常感谢

1 个答案:

答案 0 :(得分:0)

说实话,我很难跟上这个问题。更大的片段(包括它们出现的地方)的更具体的例子可能会有所帮助。

然而,Angular中的数据管理(包括第三方更改)通常是类似的,所以我可以尝试提出一种方法:

制作工厂自己的蓝牙数据/状态

服务是单例,它们提供了存储应用程序范围的单例数据+逻辑的好地方。我建议你有一个Bluetooth工厂

getAllDevices() // returns data that you want to show on screen 如果您需要更新任何与updateData()相关的蓝牙数据。

在任何控制器中,您可以注入Bluetooth工厂,您可以使用$scope.devices = Bluetooth.getAllDevices();而无需担心范围链等。

让Angular了解外部变化

如果您在第三方回调中更改了应用程序中的某些内容(例如您的第三方库的onDeviceDiscoveryCallback功能,并且如果您在此功能中更改了应用程序中的某些内容,则角度将无法知道更改和屏幕将不会更新。您可以将$rootScope注入工厂并在完成后使用$rootScope.$digest()通知角度,第三方更改了某些内容。

结论

angular.factory("Bluetooh", function($rootScope) {
  var devicesData = []; 

  thirdPartyBTLibrary.onDeviceDiscovery(function (device) {
     devicesDara.push(device);
     $rootScope.$digest(); // yo angular, there is an updat
  });

  return {
     getDevicesData: function() { return devicesData; }
  }
})


angular.controller("random", function(Bluetooh) {
   $scope.devices = Bluetooh.getDevicesData();
});

我们仅使用$rootScope来通知外部更改而不会污染它。 我们在那里制作了一个单独的实体来源和孤立的更新逻辑。 我们尽可能多地从这个实体获取数据并在屏幕上显示。