angular $ watch - 设置为同一个变量时,无法触发

时间:2014-10-22 14:14:53

标签: javascript angularjs

我试图在带有角度$ watch和工厂的控制器之间发送一些变量。它工作得很好但是我试图能够发送错误消息,如果用户试图添加相同的东西两次。通过它现在的工作方式 - 用户必须关闭该值并返回到它以发送错误消息。我相信这是因为它有一个关于功能的手表,并且设置功能正在发送相同的变量,所以它在技术上没有变化,因此手表没有触发 - 让我告诉你我的意思。

我的工厂看起来像这样 -

.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函数每次都要触发,即使发送的变量是相同的。或者我可能需要以不同的方式处理这个问题?输入将非常感激。谢谢你的阅读!

1 个答案:

答案 0 :(得分:0)

你必须复制值才能像这样触发$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;
            }
        };
    })