我试图访问控制器中指令返回的值。我尝试过服务。它不起作用;看起来控制器没有获取更新后的指令的返回值。
这是我的代码:
<html ng-app="myApp">
<body ng-controller="MainCtrl">
<input type="file" file-reader="fileContent" />
<div>{{fileContent}}</div>
</body>
</html>
myApp.controller('MainCtrl', function($scope,sharedTrialService) {
$scope.newValue = sharedTrialService.TrialInfo;
$scope.newData = $scope.newValue.data;
});
myApp.directive('fileReader', function(sharedTrialService) {
return {
scope: {
fileReader:"="
},
link: function(scope, element) {
$(element).on('change', function(changeEvent) {
var files = changeEvent.target.files;
if (files.length) {
var r = new FileReader();
r.onload = function(e) {
var contents = e.target.result.replace(/\r\n|\r/g,'\n');
scope.$apply(function () {
var lines=contents.split('\n');
scope.fileReader = lines;
sharedTrialService.TrialInfo.data=scope.fileReader;
});
};
r.readAsText(files[0]);
}
});
}
};
myApp .factory('sharedTrialService', function () {
return {
TrialInfo: {
data: " "
}
};
})
});
如何从我的控制器访问指令的sharedTrialService.TrialInfo.data
?
答案 0 :(得分:0)
使用$scope.newValue = sharedTrialService.TrialInfo.data;
,您只需将字符串分配给newValue
,但需要指定引用,因此需要分配对象或数组。因此,将其更改为$scope.newValue = sharedTrialService.TrialInfo;
并通过newValue.data
访问您的数据。
修改强>
在控制器中使用$watch
进行调试:
$scope.$watch('newValue', function() {
console.log('newValue:', $scope.newValue);
}, true);
$scope.$watch('newData', function() {
console.log('newData:', $scope.newData);
}, true);
我认为,$scope.newValue
应该更改,因为它是对象引用,但$scope.newData
只是一个字符串值,并且与上面说明的相同,它不会发生变化。因此,您始终需要通过$scope.newValue.data
访问它。
从控制台
newValue: Object {data: " "}
newData:
newValue: Object {data: Array[6]}
$scope.newData
无法更新,因为它仍然只是对该字符串值的引用。
在您的服务中,您定义字符串值" "
,TrialInfo.data
仅包含对该字符串值的引用。使用$scope.newData = $scope.newValue.data;
,您可以将该引用复制到$scope.newData
。在您的指令中,您将文件阅读器的引用复制到sharedTrialService.TrialInfo.data
,但$scope.newData
仍然引用该字符串值。 $scope.newData
和TrialInfo.data
包含不同的引用。
$scope.newValue
包含对象TrialInfo
的引用。您可以使用其属性执行所有操作,但对该对象的引用保持不变。因此,如果data
属性发生了更改,您仍然可以通过$scope.newValue.data
访问它。
也许我不是最好解释它。