Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.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 角度$watch-设置为相同变量时无法启动手表_Javascript_Angularjs - Fatal编程技术网

Javascript 角度$watch-设置为相同变量时无法启动手表

Javascript 角度$watch-设置为相同变量时无法启动手表,javascript,angularjs,Javascript,Angularjs,我试图在angular的$watch控制器和工厂之间发送一些变量。它工作得很好,但是如果用户尝试添加相同的内容两次,我会尝试发送一条错误消息。按照现在的工作方式,用户必须关闭该值并返回该值以发送错误消息。我相信这是因为它在函数上有一个手表,而set函数发送相同的变量,所以从技术上讲它不会改变,所以手表不会触发-让我告诉你我的意思 我的工厂看起来是这样的- .service("multiPromptFactory",function(){ var msg = ""; var msg2 = "";

我试图在angular的$watch控制器和工厂之间发送一些变量。它工作得很好,但是如果用户尝试添加相同的内容两次,我会尝试发送一条错误消息。按照现在的工作方式,用户必须关闭该值并返回该值以发送错误消息。我相信这是因为它在函数上有一个手表,而set函数发送相同的变量,所以从技术上讲它不会改变,所以手表不会触发-让我告诉你我的意思

我的工厂看起来是这样的-

.service("multiPromptFactory",function(){

var msg = "";
var msg2 = "";
return {
        setType: function(x) {
            msg=x; 
        },
        getType: function() {
            return msg;
        },
        setFading: function(y) {
            msg2=y; 
        },
        getFading: function() {
            return msg2;
        }
    };
})
因此,在一个控制器中,我设置了以下值-

  multiPromptFactory.setType(item);
在另一个控制器中,我听工厂的声音,就像这样-

$scope.$watch(multiPromptFactory.getType,function(typeHere){
      //add new prompt type when this fires
        $scope.storeTempName = typeHere;
                var addBlock= true;
                      for (var i=0; i<$scope.blocksHere.length; i++){
                        if($scope.blocksHere[i].typeId == $scope.storeTempName.id){
                            //already exists - fire warning for user
                            addBlock= false;
                        }
                      }
                      if(addBlock){
                        //doesn't exist yet, allow user to add 
                    }
    });

这非常有效,但是我想在用户发送相同的值时发送一条错误消息——如果变量从未更改,即使再次发送,watch似乎也不会触发。我想知道是否有某种方法可以让watch函数每次都启动,即使发送的变量是相同的。或者我只是需要换一种方式?如能提供意见,将不胜感激。谢谢你的阅读

您必须复制value才能像这样启动$watch:

.service("multiPromptFactory",function(){
    var msg = "";
    var msg2 = "";
    return {
            setType: function(x) {
                msg=x; 
            },
            getType: function() {
                return angular.copy(msg);
            },
            setFading: function(y) {
                msg2=y; 
            },
            getFading: function() {
                return msg2;
            }
        };
    })

这将导致手表在每一个摘要周期中启动。可能是,也可能不是OP想要的,而且,还有一种更简单的方法:只需$scope.$watchfunction{…whatever…}$作用域。$watchfunction{…无论如何…};但这将跟踪范围中的所有更改,对吗?我认为,如果您的代码需要在更改时使用相同的值,那么您最好重写它