2016-11-03 31 views
0

我想知道有一個更好的方法來實現我將在下面描述的內容。在Angular.js中更新藍牙低功耗設備屬性的正確方法是什麼?

比方說,我有我加載到一個陣列幾相同藍牙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; 
}; 

這是發生在工廠所以$範圍不可用。相反,我使用$ rootScope隨處可見,但由於應用程序非常龐大且複雜,部分原因是我將模型綁定到界面的方式非常難以管理。

我的問題是,有沒有更好的方式來更新我的用戶界面,有一箇中央BLE設備對象?

非常感謝

回答

0

說實話,我很難下這個問題。更大的片段(包括它們出現的位置)的更具體的示例可能會有所幫助。

然而,在角度數據管理(包括第三方的變化。)通常是相似的,所以我可以嘗試提出一個辦法:

做一個工廠自己的藍牙數據/狀態

服務是單身,它們提供了一個存儲應用程序範圍的單例數據+邏輯的好地方。我建議你有一個Bluetooth工廠

getAllDevices() // returns data that you want to show on screen ,如果你需要更新相關updateData()說不定什麼藍牙數據。

在任何控制器,你可以注入Bluetooth工廠,你可以使用$scope.devices = Bluetooth.getAllDevices();,而不必擔心範圍鏈等

讓角知道如果從第三方回調更改應用程序以外的東西改變

(比如你的第三方庫的功能onDeviceDiscoveryCallback,如果你改變了這個功能的應用程序中的某些東西,angular會不知道這個改變,屏幕也不會被更新,你可以在你的工廠注入$rootScope,並且在你之後使用$rootScope.$digest()是爲了通知角色,一些事情發生了變化d由第三方。

結論

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只通知外的變化,而不是污穢了。 我們在那裏做了一個單例實體的真相源和孤立的更新邏輯。 我們從這個實體獲得的數據與我們想要的一樣多,並且顯示在屏幕上。