我想知道有更好的方法来实现我将在下面描述的内容。
我们说我有一些相同的蓝牙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设备对象来更新我的用户界面?
非常感谢
答案 0 :(得分:0)
说实话,我很难跟上这个问题。更大的片段(包括它们出现的地方)的更具体的例子可能会有所帮助。
然而,Angular中的数据管理(包括第三方更改)通常是类似的,所以我可以尝试提出一种方法:
服务是单例,它们提供了存储应用程序范围的单例数据+逻辑的好地方。我建议你有一个Bluetooth
工厂
getAllDevices() // returns data that you want to show on screen
如果您需要更新任何与updateData()
相关的蓝牙数据。
在任何控制器中,您可以注入Bluetooth
工厂,您可以使用$scope.devices = Bluetooth.getAllDevices();
而无需担心范围链等。
如果您在第三方回调中更改了应用程序中的某些内容(例如您的第三方库的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
来通知外部更改而不会污染它。
我们在那里制作了一个单独的实体来源和孤立的更新逻辑。
我们尽可能多地从这个实体获取数据并在屏幕上显示。