【问题标题】:angular watchgroup not consistently picking up model changes角度观察组没有始终如一地接受模型更改
【发布时间】:2015-12-20 22:15:06
【问题描述】:

我有一个用于 ng-repeat 的动态 orderBy 函数。我从另一个帖子中得到了帮助。他创造了一个 plunker,效果很好。但是,当我与项目集成时,它没有按预期工作。我也用所有参考的相同版本创建了 plunker。这是发布的链接。 link to stackoverflow post

我已将其范围缩小到正在发生的事情。 在页面加载时,您会看到空数组。

这是我应用过滤器的时候。

所选过滤器正在应用于阵列。但是没有对 ng-repeat 应用任何更改。

这里是删除选定的过滤器之后。注意对象数组更改为正确的值。但是在 watchgroup 函数中有一个断点,我意识到它没有发现模型中的变化。

这是我重新应用相同过滤器的时候。监视组获取模型更改并将其应用于 orderBy 数组,该数组应该是一个空数组。

我已经三重检查以确保 javascript 引用是相同的版本。但是我不知道如何解决这个问题,因为 plunker 完美无缺?

这是我项目中的实际代码

    mapSidebarCtrl.orderBy = [];

    mapSidebarCtrl.orderOptions = [{
        name: 'Subdivision',
        value: false,
        fields: ['properties.name']
    }, {
        name: 'Total LOE',
        value: false,
        fields: ['metrics.loe.total']
    }, {
        name: 'Inventory',
        value: false,
        fields: ['metrics.inv.fut', 'metrics.inv.vdl', 'metrics.inv.mod', 'metrics.inv.uc', 'metrics.inv.fin', 'metrics.inv.total']
    }];

    $scope.$watchGroup(['mapSidebarCtrl.orderOptions[0].value', 'mapSidebarCtrl.orderOptions[1].value', 'mapSidebarCtrl.orderOptions[2].value'], function () {
        angular.forEach(mapSidebarCtrl.orderOptions, function (x) {
            if (x.value) {
                [].push.apply(mapSidebarCtrl.orderBy, x.fields);
            }
        });
    });

    SelectedTerritoryService.subscribeSelectedTerritorySubdivisions($scope, function selectedTerritorySubdivisions(event, args) {
        mapSidebarCtrl.territorySubdivisions = args
    });

html

    <div class="row">
    <div class="col-xs-12">
        <div class="panel-body p-xxs">
            <div class="row">
                <div class="col-xs-12">
                    <div class="btn-group">
                        <label class="btn btn-default btn-xs" ng-repeat="option in mapSidebarCtrl.orderOptions" ng-class="{ active: option.value }" ng-click="option.value = !option.value">
                            <i class="fa" ng-class="{ 'fa-sort-alpha-desc': option.value,  'fa-sort-alpha-asc': !option.value }"></i> {{ option.name }}
                        </label>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
<div class="panel-body p-xs m-t-sm overflow" ng-style="resizeWithOffset(300)" resize>
    <div class="panel-body p-xxs"
         ng-repeat="subdivision in mapSidebarCtrl.territorySubdivisions | orderBy: mapSidebarCtrl.orderBy">
        <a ng-click="mapSidebarCtrl.selectSubdivision(subdivision.properties.id);">
            <div class="row">
                <div class="col-xs-12">
                    <div class="pull-right text-right">
                        <img src="https://placeimg.com/75/75/any">
                    </div>
                    <h5 class="m-b-xs"><span>{{subdivision.properties.name}}</span></h5>
                    <div class="m-b-xs"><span>{{subdivision.properties.status}}</span></div>
                    <div class="badges"> <i class="fa fa-star text-warning"></i> <i class="fa fa-star text-warning"></i> <i class="fa fa-star text-warning"></i> </div>
                </div>
            </div>
        </a>
    </div>
    <pre><code>{{ mapSidebarCtrl.orderOptions | json }}</code></pre>
    <pre><code>{{ mapSidebarCtrl.orderBy | json }}</code></pre>
</div>

【问题讨论】:

    标签: javascript arrays angularjs watch angularjs-orderby


    【解决方案1】:

    您忘记在$watchGroup 回调函数中清除数组。

    $scope.$watchGroup(['vm.orderOptions[0].value', 'vm.orderOptions[1].value', 'vm.orderOptions[2].value'], function() {
    
      vm.orderBy = []; // <=- clear/reset the array
    
      angular.forEach(vm.orderOptions, function(x) {
        if (x.value) {
          [].push.apply(vm.orderBy, x.fields)
        } 
      });
    });
    

    【讨论】:

    • 就阵列而言就是这样。但是没有应用排序?
    • 从这里我很难确定。 1. 您是否在控制台中收到任何错误消息? 2.尝试用简单的东西替换整个&lt;div class="panel-body p-xs m-t-sm overflow" ng-style="resizeWithOffset(300)" resize&gt;&lt;!-- ... --&gt;&lt;/div&gt;,只是为了隔离问题。 (并逐渐添加您想要的标记)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 2019-11-05
    • 1970-01-01
    • 2014-12-24
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多