2015-04-22 50 views
0

当我第二次触发被删除。任何想法?如果您需要查看更多我的代码,请告诉我。AngularJS - 共享服务对象被错误删除

controller.js

crtPromoCtrl.controller('surveyCtrl', ['$scope', 'surveySrv', function($scope, surveySrv) 
{ 
    $scope.questions = surveySrv.getQuestions(); 

    $scope.editQuestion = function(index) 
    { 
     surveySrv.setEditQuestion(index); 
    }; 

    $scope.deleteQuestion = function(index) 
    { 
     $(document).off('click', '#confirmationModal #confirm'); 
     $('#confirmationModal').modal('show'); 

     $(document).on('click', '#confirmationModal #confirm', function() 
     { 
      surveySrv.deleteQuestion(index); 

      $scope.$apply(); 
     }); 
    }; 
}]); 

service.js

crtPromoSrv.service('surveySrv', function() 
{ 
    var questions = []; 
    var editQuestion; 

    this.getQuestions = function() 
    { 
     return questions; 
    }; 

    this.addQuestion = function(question) 
    { 
     questions.push(question); 
    }; 

    this.setEditQuestion = function(index) 
    { 
     editQuestion = questions[index]; 
    }; 

    this.getEditQuestion = function() 
    { 
     return editQuestion; 
    }; 

    this.clearEditQuestion = function() 
    { 
     editQuestion = undefined; 
    }; 

    this.deleteQuestion = function(index) 
    { 
     questions.splice(index, 1); 
     console.log(questions); 
    }; 
}); 

编辑:我想这是一个事件传播的事情,因为当我有5个Q的它删除#2和#3当我删除#2。

编辑:修正,请参阅controller.js代码。

+0

永远(永远)不在控制器中进行DOM操作。这是规则#1在尝试构建模块化代码时试图使用Angular进行测试。控制器应该从后备阵列中移除项目。操纵DOM是指令的意图。 – Enzey

+0

明白了,谢谢! – jstudios

回答

1

看起来您多次将'click'函数添加到您的按钮。第一次调用$scope.deleteQuestion时,它添加了该功能。第二次调用它时,它会再次加上,所以当它被点击时,函数被调用两次。

一个简单的解决方法是解除'click'事件之前再次添加它。像这样:$('#confirmationModal #confirm').off('click');

更好解决方案这里是不使用jQuery的这些事件绑定。使用一个简单的Angular模态指令(例如Angular-UI库中提供的指令)将是正确的方法。然后你可以在按钮上只有一个ng-click,永远不会有这个问题。

+0

尝试此操作,并在没有运气的情况下解除其他答案。如果它很重要,它似乎最多只能触发2次,换句话说,第三次点击它时不会触发它3次,等等。 – jstudios

+1

我会建议改变它做Angular方式,就像我提到的那样。你可以使用Angular-UI Modal指令[这里](https://angular-ui.github.io/bootstrap/)。或者如果你想要一些已经完成的“确认”,你可以使用[this]这样的东西(http://schlogen.github.io/angular-confirm/) – brettvd

+0

我通过把'off'放在'而不是反过来。这将是一个短暂的解决方案,因为我打算尽快采用“角度”方式。谢谢! – jstudios