【问题标题】:AngularJS : Communication between directives - ng-repeat not refreshAngularJS:指令之间的通信 - ng-repeat 不刷新
【发布时间】:2015-09-29 20:10:57
【问题描述】:

我很抱歉弄得一团糟,但这是第一次使用 stackoverflow ;)

链接到 jsfiddle http://jsfiddle.net/1u1oujmu/19/

指令和刷新 ng-repeat 之间的通信有问题。 我有两个页面 homePage 和dashboardPage - 在这些页面上,当我刷新页面 (dashboardPage) 时,我有指示一切正常,但是当我打开 homePage 并返回 dahsboardPage 时,我的问题就开始了。

步骤重现:

  • dashboardPage - 重新加载 - 添加新链接 - list-link 指令 刷新新链接在列表中
  • 转到主页
  • 返回仪表板页面
  • 尝试添加新链接 - 添加链接时(在服务器上并收到响应)我调用工厂来存储数据:
dataFactory.editData("userLinksList", result.data);

//part of factory to edit and propagation data
editData: function(name, data){
        dataArray[name] = data;
        $rootScope.$broadcast(name);
    },

然后在指令控制器中,我有条件监听传播“userLinksList”checkRootScope这是只有一个注册监听器的标志

问题出在:

$scope.data.links = dataFactory.getData("userLinksList");

$scope.data.links 我收到了新数据,但 我不知道为什么 ng-repeat 没有刷新

当我返回主页并返回仪表板时,新链接将在列表中

if(checkRootScope){
  $rootScope.$on("userLinksList", function () {
    $scope.data.links = dataFactory.getData("userLinksList");
  });
  checkRootScope = false;
}
  • homePage - 在页面上我有 list-link 指令:

     <div class="columns marketing-grid">
         <div class="col-md-6">
             <list-link hp="true"></list-link>
         </div>
     </div>
    
  • dashboardPage - 在页面上我有同样的指令,没有参数:
<div class="row">
  <div class="col-sm-12 col-md-8">
    <list-link></list-link>
  </div>
</div>

列表链接模板

<ul ng-if="data.links">
  <li ng-repeat="link in data.links | filter: search" class="link-list-item" data-id="{{link.id}}">
    <div class="row">
      <div class="col-md-9">
        <a ng-href="link.url"><h3>{{link.title}} <span>{{link.host}}</span></h3></a>
      </div>
      <div class="col-md-3 link-list-time text-right">
        {{link.date | date : 'd/MM/yyyy' }}
      </div>
      <div class="col-md-12">
        <blockquote ng-show="link.comment">{{link.comment}}</blockquote>
      </div>
      <div class="col-md-2">
        <span class="link-list-counter all" title="Number of links">{{link.counterAll}}</span>
      </div>
      <div class="col-md-6 link-list-tags">
        <span>tags:</span>
        <ul ng-if="link.tags">
          <li ng-repeat="item in link.tags"><a href="#" ng-click="">#{{item}}</a></li>
        </ul>
      </div>
      <div class="col-md-4 text-right link-list-buttons">
        <button class="btn btn-default btn-xs" title="Edit" ng-click="edit(link.id);">Edit <span class="glyphicon glyphicon-edit" aria-hidden="true"></span></button>
        <button class="btn btn-default btn-xs" title="Delete" ng-click="delete(link.id);">Delete <span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>
      </div>
    </div>
  </li>
</ul>

指令列表链接:

app.directive("listLink", ['path', function(path){
    var path = path.url(),
        checkRootScope = true;

    return {
        restrict : "E",
        scope : {
            hp : "="
        },
        templateUrl: path.template.listlink,
        replace : true,
        transclude : false,
        controller : ['$rootScope', '$scope','conn', 'auth', 'loaderService','stringOperation','dataFactory', function($rootScope, $scope, conn, auth, loaderService, stringOperation,dataFactory){

            var dataConenction = function(){
                conn.getData(path.server.link, { params : $scope.data })
                    .then(function(result){
                        if($scope.data.all == true){
                            dataFactory.addData("popularLinksList",result.data);
                            $scope.data.links = dataFactory.getData("popularLinksList");
                        } else{
                            dataFactory.addData("userLinksList",result.data);
                            $scope.data.links = dataFactory.getData("userLinksList");
                        }


                    }, function(msg){
                        console.log(msg);
                    });
            };

            $scope.hp = (typeof $scope.hp === "undefined" ? false : $scope.hp);
            $scope.path = path;
            $scope.userInfo = auth.getUserInfo();
            $scope.data = {
                auth : $scope.userInfo,
                check : false,
                all : $scope.hp
            };

            dataConenction();

            if(checkRootScope){
                $rootScope.$on("userLinksList", function () {
                    $scope.data.links = dataFactory.getData("userLinksList");
                });
                checkRootScope = false;
            }

            $scope.edit = function(id){
                $rootScope.$broadcast("editLink", {"id": id});
            };

            $scope.delete = function(id){
                var check = confirm("Are you sure you want to remove?");
                if (check == true) {
                    conn.deleteData(path.server.link, {"params" : {auth : $scope.userInfo, id : id}})
                        .then(function(result){
                            dataFactory.editData("userLinksList",result.data.links);
                            $scope.data.links = dataFactory.getData("userLinksList");

                            dataFactory.editData("userTagsList",result.data.tags);

                        }, function(msg){
                            console.log(msg);
                        });
                }
            };

        }]
    }
}]);

【问题讨论】:

  • 我在 jsfiddle 中添加了简单的解决方案 http://jsfiddle.net/1u1oujmu/19/
  • 那么,你的问题解决了吗?
  • 我认为应该有“简单的问题示例”而不是解决方案。

标签: javascript angularjs angularjs-directive angularjs-ng-repeat


【解决方案1】:

不确定你是否已经修好了,但我已经解决了。

首先是“为什么不工作”部分 -
Page1 创建了一个新的范围,比如说 scope1。
Page2 创建了一个新范围,例如 scope2。

当点击 Page1 时,data.link 被设置为 5 项,下面的代码运行 [scope1.data.link = 5 项] -

        if(checkRootScope){
            $rootScope.$on("userLinksList", function () {
                $scope.data.links = dataFactory.getData("userLinksList");
            });
            checkRootScope = false;
        }

当Page2被点击时,它将7项设置为dataFactory并广播到并执行$rootScope.on以将scope2.data.links更新为7项。但是 scope2.data.links 仍然设置为 5 个项目。这是因为第一次执行 $rootScope.on 时,"on" 函数中的 "$scope" 变量指的是闭包范围,即 scope1NOT范围2。所以基本上当 scope.data.links 设置为 7 时,scope.data.links 设置为 7 而 scope2.data.links 仍然设置为 5。

基本上 ng-view 会创建一个新范围,如果指令是每个视图的一部分,那么您最终会在每个视图中拥有不同的 data.link 值。

解决方案: 您可以通过两种方式修复它:

选项 1:最好在承诺解决后立即在范围内设置值,而不是在工厂中设置并在 $on 侦听器中从中获取值。至少在这种情况下。

http://plnkr.co/edit/IdrsO1OT9zDqdRiaSBho?p=preview

选项 2:如果本质上是广播,我认为您必须将 data.link 绑定到 rootscope(这可能不是一个好习惯)。

http://plnkr.co/edit/VptbSKRf7crU3qqNyF3i?p=preview

可能还有其他选择...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多