Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 AngularJS,ng重复不';不要重复_Javascript_Angularjs_Angularjs Ng Repeat_Frontend - Fatal编程技术网

Javascript AngularJS,ng重复不';不要重复

Javascript AngularJS,ng重复不';不要重复,javascript,angularjs,angularjs-ng-repeat,frontend,Javascript,Angularjs,Angularjs Ng Repeat,Frontend,我是AngularJs的新手,我面临着ng repeat的问题。基本上,我希望使用ajax从数据库中获取与文章相关的注释,然后使用ng repeat显示它们。然后我有一个数组,在其中我推送我的评论。我的问题是,当我在数组中手动创建注释时,它工作得很好,但是如果我从ajax函数的回调中自动推送该注释,那么数组将被更新,而不是视图 以html格式查看: var articleApp=angular.module('articleApp',[]); articleApp.controller('Co

我是AngularJs的新手,我面临着ng repeat的问题。基本上,我希望使用ajax从数据库中获取与文章相关的注释,然后使用ng repeat显示它们。然后我有一个数组,在其中我推送我的评论。我的问题是,当我在数组中手动创建注释时,它工作得很好,但是如果我从ajax函数的回调中自动推送该注释,那么数组将被更新,而不是视图

以html格式查看:

var articleApp=angular.module('articleApp',[]);
articleApp.controller('CommentsController',函数CommentsController($scope){
$scope.comments=[];
//此推送工作正常,我的视图已更新
$scope.comments.push({
内容:“你好,世界!”,
日期:“2分钟前”,
身份证号码:29,
作者:{
伪:“肖恩”
}
});
//当我使用此函数推送时,我的数组会更新,但视图不会更新
$scope.addComment=函数(注释){
$scope.comments.push({
内容:comment.comment,
id:comment.id,
日期:comment.date\u post,
作者:{
id:comment.author.id,
pseudo:comment.author.pseudo
}
});
};
var articleID=document.getElementById('articleID').textContent;
//getComments在别处定义,并返回前20条注释
getComments(20,articleID,0,函数(comments){
对于(var i=0;i

{{comment.author.pseudo}
{{comment.date}
{{comment.content}

看起来您的
getComments
是异步工作的,因为您正在传递一个回调函数,该函数将注释作为参数

因此,即使您在回调中更新了您的注释,AngularJS似乎也没有“注意到”,对吗

这是因为您必须显式地告诉AngularJS运行新的摘要循环

简而言之,只需在回调的末尾添加
$scope.$apply()

getComments(20, articleID, 0, function(comments) {
    for(var i = 0; i < comments.length; i++) {
        $scope.addComment(comments[i]);
    }
    $scope.$apply();
});
getComments(20,articleID,0,函数(comments){
对于(var i=0;i

要了解更多信息,请搜索“AngularJS摘要周期”。简而言之,问题是:AngularJS以所谓的摘要周期更新所有内容。如果一个摘要周期没有发生,AngularJS将不会“注意”这些变化。当事情同步运行时,AngularJS自动运行摘要循环。但是对于许多异步的事情,AngularJS无法自动解决,因此您必须明确地告诉AngularJS执行摘要循环。

您可以尝试执行以下类似的代码,也请使用一些虚拟操作检查给定的示例场景

控制器:

$scope.comments = [];
    $scope.comment={};
    // This push works well, my view is updated
    $scope.comments.push({
        content: "Hello world !",
        date: "2 minutes ago",
        id: 29,
        author: {
            pseudo: "Sean"
        }
    });
    $scope.comments.push({
        content: "Hello world 2!",
        date: "5 minutes ago",
        id: 30,
        author: {
            pseudo: "Jack"
        }
    });
    // When I push with this function, my array is updated, but not the view
    $scope.addComment = function() {
        $scope.comments.push({
            content: $scope.comment.comment,
            id: $scope.comments.length+1,
            date: new Date(),
            author: {
                id: $scope.comments.length+1,
                pseudo: $scope.comment.comment
            }
        });
        console.log($scope.comments);
    };
<section id="commentsSection" class="bottom_apps" ng-controller="CommentsController">
      <input type="text" ng-model="comment.comment"/>
      <button type="button" ng-click="addComment()">Add Comment</button><br/>
      <article id = "{{comment.id}}" class="comment_container" ng-repeat="comment in comments">
        <div class="comment_header">
          <span class="comment_author">{{comment.author.pseudo}}</span>
          <span class="comment_date">{{comment.date}}</span>
        </div>
        <div class="comment_content">
          {{comment.content}}
        </div>
      </article>
    </section>
模板:

$scope.comments = [];
    $scope.comment={};
    // This push works well, my view is updated
    $scope.comments.push({
        content: "Hello world !",
        date: "2 minutes ago",
        id: 29,
        author: {
            pseudo: "Sean"
        }
    });
    $scope.comments.push({
        content: "Hello world 2!",
        date: "5 minutes ago",
        id: 30,
        author: {
            pseudo: "Jack"
        }
    });
    // When I push with this function, my array is updated, but not the view
    $scope.addComment = function() {
        $scope.comments.push({
            content: $scope.comment.comment,
            id: $scope.comments.length+1,
            date: new Date(),
            author: {
                id: $scope.comments.length+1,
                pseudo: $scope.comment.comment
            }
        });
        console.log($scope.comments);
    };
<section id="commentsSection" class="bottom_apps" ng-controller="CommentsController">
      <input type="text" ng-model="comment.comment"/>
      <button type="button" ng-click="addComment()">Add Comment</button><br/>
      <article id = "{{comment.id}}" class="comment_container" ng-repeat="comment in comments">
        <div class="comment_header">
          <span class="comment_author">{{comment.author.pseudo}}</span>
          <span class="comment_date">{{comment.date}}</span>
        </div>
        <div class="comment_content">
          {{comment.content}}
        </div>
      </article>
    </section>

添加评论
{{comment.author.pseudo} {{comment.date} {{comment.content}
ng controller=“comments controller as comments”
更改为
ng controller=“comments controller”
。始终四重选中它似乎可以更改任何内容:/
getComments
没有定义好,调用
$scope.addComment
的代码没有任何意义<代码>id
没有在任何地方定义,在HTML中它们是动态的
getComments
未定义;您的代码都没有显示如何使用AJAX调用任何东西。否则,我没有粘贴所有代码,articleID和getComments()都已定义并正常工作。我知道它们可以工作,因为在addComment()之后使用console.log($scope.comment),我看到我的数组确实包含了我的所有注释。@GabrielRayzal不客气:)如果它对您有帮助,请随意向上投票并选择绿色复选标记:)