我遇到了绑定工厂和控制器的对象和视图的问题。AngularJS工厂对象没有在控制器和视图上更新
我想获取用户选择的图片的fileUri。到现在为止还挺好。问题是我正在将文件的值保存到overlays.dataUrl
。但是我在视图上引用了它,并没有更新。 (我检查和值实际上保存到overlays.dataUrl
可变
这里不用的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();
}
}
})();
现在控制器:
(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
}
}
})();
Finnally上视图:
<h1>{{vm.settings.overlays.dataUrl}}</h1>
<button id="overlay" class="button"
ng-click="vm.settings.selectOverlayFile()">
Browse...
</button>
每当我改变事实中的值ory,它在视图中不会改变。
在此先感谢!
在我的指令答案中,当我做'vm.overlay = settingsService.overlay'时,它没有通过更新。只有当我将更新后的值作为函数参数传递时(在$ on中),并执行:$ on(“overlaysUpdate”,function(event,overlays){ vm.overlays = overlays; }); ' 我得到更新的值...这是正常的吗? –
@RafaelLourenco这是正确的,除非您不需要通过$ on传递更新后的值,否则只需在回调完成后再设置vm.overlay = settingsService.overlay即可。原始变量vm.overlay不会自动更新,因为这是单例的性质,需要强制更新,无论您是通过传递$ on还是仅在您从$ on接收回调后重置它。 – Ohjay44