Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度-$观察以检查服务状态_Javascript_Angularjs - Fatal编程技术网

Javascript 角度-$观察以检查服务状态

Javascript 角度-$观察以检查服务状态,javascript,angularjs,Javascript,Angularjs,我正在使用AngularJSV1.4.8。我定义了以下服务,以保留用户当前正在编辑的表单: orderApp.service('editAddressService', function(){ var currentEdit = ''; return { getCurrentEdit: function(){ return currentEdit; }, setCurrentEdit: function

我正在使用AngularJSV1.4.8。我定义了以下服务,以保留用户当前正在编辑的表单:

  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的核心的双向绑定。