我是angularjs
的初学者。在我的NFC项目中,我希望能够根据不断变化的patientId
从服务器数据中获取。
但是,即使我看到每次扫描新的NFC标签时$watch
都发生了变化,我也无法正确执行patientId
执行。
var nfc = angular.module('NfcCtrl', ['PatientRecordsService'])
nfc.controller('NfcCtrl', function($scope, NfcService, PatientRecordsService) {
$scope.tag = NfcService.tag;
$scope.patientId = NfcService.patientId
$scope.$watch(function() {
return NfcService.patientId;
}, function() {
console.log("Inside watch");
PatientRecordsService.getPatientRecords(NfcService.patientId)
.then(
function(response) {
$scope.patientRecords = response
},
function(httpError) {
throw httpError.status + " : " +
httpError.data;
});
}, true);
$scope.clear = function() {
NfcService.clearTag();
};
});
nfc.factory('NfcService', function($rootScope, $ionicPlatform, $filter) {
var tag = {};
var patientId = {};
$ionicPlatform.ready(function() {
nfc.addNdefListener(function(nfcEvent) {
console.log(JSON.stringify(nfcEvent.tag, null, 4));
$rootScope.$apply(function(){
angular.copy(nfcEvent.tag, tag);
patientId = $filter('decodePayload')(tag.ndefMessage[0]);
});
console.log("PatientId: ", patientId);
}, function() {
console.log("Listening for NDEF Tags.");
}, function(reason) {
alert("Error adding NFC Listener " + reason);
});
});
return {
tag: tag,
patientId: patientId,
clearTag: function () {
angular.copy({}, this.tag);
}
};
});
不确定我在这里失踪了什么 - 请赐教我!
更新 根据rakslice的推荐,我创建了一个对象来保存工厂内的数据,现在html(有一些服务器端延迟)在扫描新的NFC标签时正确显示更新的值。
var nfc = angular.module('NfcCtrl', ['PatientRecordsService'])
nfc.controller('NfcCtrl', function($scope, NfcService) {
$scope.tagData = NfcService.tagData;
$scope.clear = function() {
NfcService.clearTag();
};
});
nfc.factory('NfcService', function($rootScope, $ionicPlatform, $filter, PatientRecordsServi\
ce) {
var tagData = {
tag: null,
patientId: null,
patientRecords: []
};
$ionicPlatform.ready(function() {
nfc.addNdefListener(function(nfcEvent) {
//console.log(JSON.stringify(nfcEvent.tag, null, 4));
$rootScope.$apply(function() {
tagData.tag = nfcEvent.tag;
tagData.patientId = $filter('decodePayload')(tagData.tag.ndefMessage[0]);
PatientRecordsService.getPatientRecords(tagData.patientId)
.then(
function(response) {
tagData.patientRecords = response
},
function(httpError) {
throw httpError.status + " : " +
httpError.data;
});
});
console.log("Tag: ", tagData.tag);
console.log("PatientId: ", tagData.patientId);
}, function() {
console.log("Listening for NDEF Tags.");
}, function(reason) {
alert("Error adding NFC Listener " + reason);
})
});
return {
tagData: tagData,
clearTag: function() {
angular.copy({}, this.tagData);
}
};
});
答案 0 :(得分:0)
您的代码不会更新返回的patientId
中的NfcService
值,只会更新工厂函数中的本地变量patientId
。
尝试在工厂函数中保存对您要返回的对象的引用,如同在局部变量中一样,并使用它来更新patientId
。
例如,更改对象的创建以将其放在局部变量中:
var nfcService = {
tag: tag,
patientId: patientId,
clearTag: function () {
angular.copy({}, this.tag);
}
};
...
return nfcService
然后更改patientId
更新以通过变量更改对象中的值。
nfcService.patientId = $filter('decodePayload')(tag.ndefMessage[0]);
<强>更新强>:
您需要了解的关于JavaScript的基本事实是,当您将一个变量分配给另一个变量时,如果第一个变量具有原始数据值,则第二个变量获取该值的副本,因此更改第一个变量不会在那之后影响第二个变量,但是如果第一个变量有一个对象引用,则第二个变量指向第一个变量所指向的同一个对象,然后在第一个变量中更改对象会影响你通过第二个变量,因为它正在查看同一个对象。
浏览器JavaScript控制台中的快速实验可以为您提供这样的想法:
> var a = 1;
> a
1
> var b = a;
> b
1
> a = 5;
> a
5
> b
1
VS
> var a = {foo: 1}
> var b = a
> a.foo = 5
> a.foo
5
> b.foo
5