Angularjs 访问父$scope

Angularjs 访问父$scope,angularjs,angularjs-scope,angularjs-ng-repeat,Angularjs,Angularjs Scope,Angularjs Ng Repeat,我在早些时候发布了这篇文章,选择不提供所有代码。但是现在我遇到了同样的问题,所以我改变了主意,提供了我所有的代码 我知道当代码庞大时,调试并不容易,所以我将尝试精确地解释这个问题 事实上,这个问题在我的先例中已经描述过了,所以请阅读并查看简化后的代码 但基本上问题是:我想从$scope.deleteComent函数访问$scope.data.comments 当您看到下面的代码时,您会注意到我必须添加两次ng controller=CommentController才能工作。 如果有人能解释为什

我在早些时候发布了这篇文章,选择不提供所有代码。但是现在我遇到了同样的问题,所以我改变了主意,提供了我所有的代码

我知道当代码庞大时,调试并不容易,所以我将尝试精确地解释这个问题

事实上,这个问题在我的先例中已经描述过了,所以请阅读并查看简化后的代码

但基本上问题是:我想从$scope.deleteComent函数访问$scope.data.comments

当您看到下面的代码时,您会注意到我必须添加两次ng controller=CommentController才能工作。 如果有人能解释为什么。。那太好了,但我想这是另一个问题

提前感谢你的帮助

主HTML

指令


每个ng控制器指令都会生成控制器的唯一实例。您正在父控制器中加载注释,并试图在子控制器实例中删除注释。我建议您重构代码。编写两个不同的控制器。一个用于所有注释CommentsController,另一个用于单个注释CommentController。创建一个保留注释的服务,将此服务注入到您的两个新控制器,并将函数调用委托给您的服务。首先,我要感谢您花时间阅读我的所有代码。第二,谢谢你的回答,这会让我走上我知道我做错了什么但不知道是什么的道路。再次感谢!只是一个问题:为什么我不能使用相同的控制器,并且在您正在使用ng repeat的根div上只使用一个ng controller=CommentController。因此angualr为您的孩子控制器添加了一个新范围。
<div ng-init="loadComments('${params.username}', '${params.urlname}' )" ng-controller="CommentController">
    <div ng-repeat="comments in data.comments"  >
        <div sdcomment param="comments" ></div>
    </div>
</div>
var soundshareApp = angular.module('soundshareApp', ['ngCookies']);
soundshareApp.directive('sdcomment', ['$cookies', function($cookies){

    var discussionId = null;
    var found = false;
    var username = $cookies.soundshare_username;

    return {
        restrict:'A',
        scope: {
            commentData: '=param'
        },
        templateUrl: '/js/views/comment/templates/commentList.html',

        link : function(scope, element, attrs, controller) {
            scope.$watch(element.children(), function(){
                var children = element.children();
                for(var i=0; i<children.length; i++){
                    if(children[i].nodeType !== 8){ //pas un commentaire <!-- -->
                        if( !found ){
                            found = true;
                            discussionId == scope.commentData.discussionId
                        }else if(found && discussionId == scope.commentData.discussionId){
                            angular.element(children[i]).removeClass('message-content');
                            angular.element(children[i]).addClass('answer-message-content');
                        }
                        if(found && discussionId != scope.commentData.discussionId){
                            discussionId = scope.commentData.discussionId
                        }

                        if(username == scope.commentData.username){
                            element.parent().bind('mouseover', function() {
                              // $(".delete-comment-button").show()
                               element.parent().find("span.delete-comment-button:first").attr('style', 'display: block !important');
                            });
                            element.parent().bind('mouseleave', function() {
                                element.parent().find("span.delete-comment-button:first").attr('style', 'none: block !important');
                            });
                        }
                    }
                }
            });
        }
    }
}]);
<div class="message-wrapper"  ng-controller="CommentController">
    <div  class='message-content' ng-click="state.show = !state.show; setUsername(commentData.username)">
        <img class='message-vignette' ng-src='{{commentData.avatarUrl}}'/>
        <div class='message-username'>{{commentData.username}}</div>
        <div class='project-message'>{{commentData.comment}}</div>
        <div class='message-date'>{{commentData.dateCreated | date:'dd.MM.yyyy @ hh:mm:ss' }}</div>
        <div class="clearfix"></div>
    </div>

    <div ng-repeat="answer in answers" class="answer-message-content"  >
        <div class='message-content' ng-click="state.show = !state.show">
            <img class='message-vignette' ng-src='{{answer.avatarUrl}}'/>
            <div class='message-username'>{{answer.username}}</div>
            <div class='project-message'> {{answer.comment}}</div>
            <div class='message-date'>{{answer.dateCreated | date:'MM/dd/yyyy @ h:mma' }}</div>
            <div class="clearfix"></div>
        </div>
    </div>

    <div class="add-comment-content show-hide" ng-show="state.show"  >
        <img class='message-vignette answer-message-vignette' ng-src='{{commentData.currentUserAvatarUrl}}'>
        <div class="">
            <form ng-submit="addComment(commentData)"   id="commentForm-{{commentData.projectId}}">
                <input id="input-comment-{{commentData.projectId}}" type="text" maxlength=""  autofocus="autofocus" name="comment" placeholder="Write a comment..." ng-model="commentData.msg">
                <input type="hidden" name="discussionId" value="{{commentData.discussionId}}" >
                <input type="hidden" name="projectId" value="{{commentData.projectId}}" >
            </form>
        </div>
    </div>
    <span ng-click="deleteComment(commentData)" class="btn btn-default btn-xs delete-comment-button"><i class="icon-trash"></i></span>
</div>
'use strict';
soundshareApp.controller('CommentController', function($scope, $http) {

    $scope.data = { comments : [] }
    $scope.answers = [];
    $scope.state = {}
    $scope.project = { id : [] }
    $scope.username = null;

    $scope.loadComments = function(userName, urlName){
        $http({
            url: '/comment/by_project_id',
            method: "GET",
            params:
            {
                username: userName,
                urlname: urlName
            }
        }).success(function(data) {
            $scope.data.comments = data;
            console.log($scope.data.comments);//WORKING
        });;
    }

    $scope.addComment = function(commentData){
        if("undefined" != commentData.msg){
            commentData.msg = "@" + $scope.username + ": " + commentData.msg;
            $http({
                method : "POST",
                url : "/comment/addAnswer",
                params:
                {
                    comment: commentData.msg,
                    discussionId: commentData.discussionId,
                    projectId:commentData.projectId
                }
            }).success(function(data){
                $scope.answers.push(data);
                $('.show-hide').hide();
                $scope.commentData.msg = '';
            });
        }
    }

    $scope.setUsername = function(username){
        $scope.username = username;
    }

    $scope.deleteComment = function ( comment ) {
        console.log($scope.data.comments);//NOT WORKING
    };

});