Javascript 角度-$观察以检查服务状态
我正在使用AngularJSV1.4.8。我定义了以下服务,以保留用户当前正在编辑的表单:Javascript 角度-$观察以检查服务状态,javascript,angularjs,Javascript,Angularjs,我正在使用AngularJSV1.4.8。我定义了以下服务,以保留用户当前正在编辑的表单: orderApp.service('editAddressService', function(){ var currentEdit = ''; return { getCurrentEdit: function(){ return currentEdit; }, setCurrentEdit: function
orderApp.service('editAddressService', function(){
var currentEdit = '';
return {
getCurrentEdit: function(){
return currentEdit;
},
setCurrentEdit: function(value){
currentEdit = value;
},
clearCurrentEdit: function(){
currentEdit = '';
}
}
});
现在,我想在控制器中使用此信息,并收到有关任何更改的通知。所以我写了这个函数:
orderApp.controller('AddressController', ['editAddressService', '$scope', function(editAddressService, $scope){
var addressCtrl = this;
addressCtrl.editMode = false;
addressCtrl.toEditMode = function(){
addressCtrl.beforeEdit = angular.copy(addressCtrl.address);
addressCtrl.editMode = true;
editAddressService.setCurrentEdit(addressCtrl.addressType);
console.log("Check changes - "+editAddressService.getCurrentEdit());
};
...
//Check if user starts to edit another address widget. In this case
//close current editing form
$scope.$watch('editAddressService.getCurrentEdit()', function(newVal, oldVal){
console.log("New value - "+newVal);
console.log("My value - "+addressCtrl.addressType);
if(addressCtrl.addressType !== newVal){
addressCtrl.cancelEdit();
}
});
}]);
根据控制台输出,值更改时不执行监视功能。我错过了什么吗?
$watch
可以处理函数调用的结果和字符串:
$scope.$watch(function() {
return editAddressService.getCurrentEdit();
}, function(newVal, oldVal){
console.log("New value - "+newVal);
console.log("My value - "+addressCtrl.addressType);
if(addressCtrl.addressType !== newVal){
addressCtrl.cancelEdit();
}
});
请注意,函数可以并且将经常被调用,因此请确保它不会改变任何内容。传递给作用域的字符串。$watch正在该作用域中求值。editAddressService在此范围内未知,因此它始终未定义。。。注意:这段代码看起来很奇怪,真的(你真的需要这项服务吗?只需将currentEdit存储在controller中-这就是controller的用途。等等@PetrAveryanov我有2个地址表单,每个表单都使用AddressController。我的目标是允许用户一次只编辑一个表单-这就是我创建“editAddressService”的原因保留当前编辑表单的记录。您可以建议其他方法在没有服务的情况下实现它吗?这完全取决于您想要什么:最简单的情况-只需将此“currentEdit”添加到AddressController的父级。对于更高级的选项,您可能希望使用angular xeditable或以相同的方式实现您自己的可编辑。无论如何,使用这样的服务不明智,至少我看不到这种代码的未来。@PetrAveryanov我将尝试向父控制器添加“currentEdit”属性。但我不清楚如何从它的父控制器调用AddressController操作。另外,我一周前开始学习,所以不要对代码的怪异感到惊讶:)虽然你在这里试图实现的目标基本上是合理的,但这与角度设计背道而驰。实际上,您正在破坏位于angular的核心的双向绑定。