Ich bin mit einem Problem mit der Bindung eines Objekts einer Fabrik und eines Controllers und es ist Sicht.AngularJS Factory-Objekt wird nicht auf Controller und Ansicht aktualisiert
Ich versuche, die DateiUri eines vom Benutzer ausgewählten Bildes zu erhalten. So weit, ist es gut. Das Problem ist, dass ich den Wert dieser Datei auf overlays.dataUrl
speichern werde. Aber ich verweise es auf die Ansicht und es wird nicht aktualisiert. (I geprüft und der Wert wird gespeichert tatsächlich auf die overlays.dataUrl
Variable
Hier geht den Quellcode settings.service.js
.
(function() {
"use strict";
angular
.module("cameraApp.core")
.factory("settingsService", settingsService);
settingsService.$inject = ["$rootScope", "$cordovaFileTransfer", "$cordovaCamera"];
function settingsService($rootScope, $cordovaFileTransfer, $cordovaCamera) {
var overlays = {
dataUrl: "",
options: {
sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
destinationType: Camera.DestinationType.FILE_URI
}
};
var errorMessages = [];
var service = {
overlays: overlays,
selectOverlayFile: selectOverlayFile,
errorMessages: errorMessages
};
return service;
function selectOverlayFile() {
$cordovaCamera.getPicture(overlays.options).then(successOverlay, errorOverlay);
}
//Callback functions
function successOverlay(imageUrl) {
//If user has successfully selected a file
var extension = "jpg";
var filename = getCurrentDateFileName();
$cordovaFileTransfer.download(imageUrl, cordova.file.dataDirectory + filename + '.' + extension, {}, true)
.then(function (fileEntry) {
overlays.dataUrl = fileEntry.nativeURL;
}, function (e) {
errorMessages.push(e);
});
}
function errorOverlay(message) {
//If user couldn't select a file
errorMessages.push(message);
//$rootScope.$apply();
}
}
})();
nun den Controller:
(function() {
angular
.module("cameraApp.settings")
.controller("SettingsController", SettingsController);
SettingsController.$inject = ["settingsService"];
function SettingsController(settingsService) {
var vm = this;
vm.settings = settingsService;
activate();
//////////////////
function activate(){
// Nothing here yet
}
}
})();
Zu guter Letzt muss auf der Ansicht:
<h1>{{vm.settings.overlays.dataUrl}}</h1>
<button id="overlay" class="button"
ng-click="vm.settings.selectOverlayFile()">
Browse...
</button>
Immer wenn ich den Wert in der Tat ändern Oder, es ändert sich nicht in der Ansicht.
Vielen Dank im Voraus!
Auf meine Antwort in der Direktive, wenn ich 'vm.overlay = settingsService.overlay' mache es nicht das aktualisierte. Nur wenn ich den aktualisierten Wert als Funktionsargument übergebe (im '$ on'), und mache: ' $ on ("overlaysUpdate", Funktion (Ereignis, Overlays) { vm.overlays = Overlays; }); ' Ich bekomme den aktualisierten Wert ... Ist das normal? –
@RafaelLourenco das ist korrekt, außer Sie müssen den aktualisierten Wert nicht durch Ihre $ on übergeben, wenn Sie nicht möchten, alternativ können Sie einfach vm.overlay = settingsService.overlay erneut einstellen, sobald der Rückruf abgeschlossen ist. Die Originalvariable vm.overlay wird nicht automatisch aktualisiert, da dies die Natur von Singletons ist und gezwungen werden muss, zu aktualisieren, ob Sie das tun, indem Sie $ on übergeben oder nur zurücksetzen, sobald Sie einen Rückruf von $ on erhalten. – Ohjay44