【问题标题】:Update parent scope through child scopes in Angular通过 Angular 中的子作用域更新父作用域
【发布时间】:2016-05-26 12:47:41
【问题描述】:
<div class="full-row" ng-repeat="row in pendingRequests | orderBy: '-modificationDate' | partition:3">
                      <div class="one-third" ng-repeat="request in row track by request.id">
                          <div class="incoming_request" ng-class="actionClass(request)">
                              <div class="request_comments">
                                  <hr>
                                  <p><span>Recipients:</span></p>
                                  <div class="comments">
                                      <p ng-repeat="comment in request.comments track by comment.id" class="dont-break-out">
                                          <span class="author" ng-bind="comment.userName | employeeName">:</span>
                                          {{comment.text}}
                                          <span ng-if="comment.status == State.APPROVED" class="approval success" ng-click="changestatus(comment, request)"><i class="fa fa-check"></i></span>
                                          <span ng-if="comment.status == State.REJECTED" class="approval error" ng-click="changestatus(comment, request)"><i class="fa fa-times"></i></span>
                                          <span ng-if="comment.status == State.PENDING" class="approval" ng-click="changestatus(comment, request)" title="{{showApproveTooltip(comment)?'Click to approve the request on behalf of this user':''}}"><i class="fa fa-clock-o"></i></span>
                                      </p>
                                  </div>
                              </div>
                              <div class="request_resolve">
                                  <hr>
                                  <div class="textarea-holder">
                                      <textarea placeholder="Your comment..." ng-model="request.newComment" ng-model-options="{ updateOn: 'default blur'}"></textarea>
                                  </div>
                                  <div class="button-container">
                                      <button ng-click="approve(request);" ng-disabled="request.isProcessing" class="btn btn-primary" am-hide-request-resolve-div>Confirm<i ng-hide="request.isProcessing" class="fa fa-check"></i><span ng-show="request.isProcessing" class="spinner no-hover"><a><i class="fa-li fa fa-spinner fa-spin"></i></a></span></button>
                                      <button ng-click="reject(request);" ng-disabled="request.isProcessing" class="btn btn-default pull-right" am-hide-request-resolve-div>Reject <i class="fa fa-times"></i></button>
                                  </div>
                              </div>

这里是和平的代码。如您所见,有很多ng-repeats。我的pendingRequests 收藏经常从服务器更新。 3 次或更多更新后,当我单击某个按钮时,UI 上什么也没有发生。

详情:

在批准点击时,我将status 更改为一个comment

$scope.approve  = function (request) {
        var currentUserComment = request.comments.filter(function(comm) {
                return comm.userId == user.id && comm.status == "Pending";
            })[0];
        currentUserComment.status = State.APPROVED; // change comments Status
        currentUserComment.text = request.newComment;

        delete request.newComment;

        if (!currentUserComment) {
            request.isProcessing = false;
            return;
        }

        Comments.update(currentUserComment, function() {
            // $rootScope.$broadcast('daysUpdated');   
        });

        request.isProcessing = false;
    };

这必须显示这个跨度&lt;span ng-if="comment.status == State.APPROVED" class="approval success" ng-click="changestatus(comment, request)"&gt;&lt;i class="fa fa-check"&gt;&lt;/i&gt;&lt;/span&gt;,因为现在状态等于State.APPROVED。但是什么也没发生。

经过一些研究,我认为这一切都是因为 ng-repeat 和收藏更新。

ng-repeat 为每个项目创建一个子范围,因此正在运行的范围可能如下所示:

bookCtrl scope = { tags: ['foo', 'bar', 'baz' ] }

ng-repeat 子作用域:{ tag: 'foo' }, { tag: 'bar' }, { tag: 'baz' }

所以当我为某些request 更新comment.status 时,Angular 不知道它存在于什么范围内。

我说的对吗?我该如何解决我的问题(更改评论状态后显示正确的跨度)?


更简单的代码:

<div ng-repeat="request in requests">
      <div ng-repeat="comment in request.comments">
            <span ng-if="comment.status == State.APPROVED" class="approval success"><i class="fa fa-check"></i></span>
            <span ng-if="comment.status == State.REJECTED" class="approval error"><i class="fa fa-times"></i></span>
            <span ng-if="comment.status == State.PENDING" class="approval"><i class="fa fa-clock-o"></i></span>
      </div>
      <div>
          <button ng-click="approve(request)">
            Approve
          </button>
      </div>
    </div>

并批准功能:

var user = LoggeInUser(); // some user who is loggedIn now
$scope.approve = function(request){
            var currentUserComment = request.comments.filter(function(comm)                        {
            return comm.userId == user.id && comm.status == "Pending";
        })[0];
    currentUserComment.status = State.APPROVED; // change comments Status

    Comments.update(currentUserComment, function() { // send PUT request to API
        // $rootScope.$broadcast('daysUpdated');   
    });
}

【问题讨论】:

  • 你能否举一个更小的例子,它只包含 HTML 和 JS 中所需的内容,而不是实际代码?这将有助于理解
  • @floribon,希望现在是更简单的例子
  • 它抛出了什么错误?
  • @VinoDang,没有错误。只有正确的span在更改comment.status后不显示

标签: javascript html angularjs angularjs-ng-repeat


【解决方案1】:

您可能会在将函数移至 $scope.functions.functionName 中找到解决方案。正如您在声明中提到的那样,我相信通过审查这一点,您遇到了范围界定问题。

JS

$scope.functions.approve = function () { ... }

HTML

functions.approve(request)

您也可以看看使用控制器,有时这会有所帮助:

https://docs.angularjs.org/api/ng/directive/ngController

【讨论】:

  • 我所有的功能都在控制器内部
  • 是的,但我的建议是从 $scope.functionName 移动到 $scope.functions.functionName(在您的控制器内)。
  • 不。这没有帮助
  • 你能创建一个演示来帮助我和其他人进行故障排除吗?
  • 我试图重现问题jsfiddle.net/U3pVM/25128 但我不能:( 在示例中我无法进行更新集合
猜你喜欢
  • 2020-04-22
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多