修改范围变量后,范围绑定不会更新

时间:2015-02-14 20:33:24

标签: javascript angularjs angularjs-scope

提交$ Modal(modalInstance)我正在更新范围内的数组($ scope.expenses)视图绑定到对象,数据表使用"费用"作为数据。我可以看到$ scope.expenses在调试时得到了更新,并且正在插入一个新项目,但在表中和{{expense.length}}绑定中我看不到更新。我已经阅读了很多关于这个问题的问题,插入是在有角度的一面执行的,所以如果我理解不需要apply \ digest。

我试过了:

  • 在推送后调用$ scope。$ digest \ $ scope。$ apply()(导致摘要已经在进行中的错误)
  • 将推送包装在$ scope中的函数中。$ apply(function)。同样的错误,摘要已在进行中
  • 使用$ timeout,因此推送将被推迟到下一个摘要周期 - 视图未获得更新

上述选项均无法解决问题。

查看(我确实看到了推送前的长度,因此在视图中正确定义了绑定,这就是为什么我不粘贴整个视图):

<div class="row">
    <div class="ibox-content col-lg-10 col-lg-offset-1" ng-controller="LiveCtrl">
        {{expenses.length}}


        <div class="col-md-1" ng-controller="LiveCtrl">
            <button class="btn btn-link" ng-click="openAddExpenseModal()">
                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Expense
            </button>
        </div>
    </div>
</div>

控制器代码,我推动新项目的费用:

  modalInstance.result.then(function (newExpense) {
  ExpenseService.addExpense(newExpense).then(function (id) {
            console.log(id);
            $scope.expenses.push(newExpense);
        }, function (rejectData) {
            console.log(rejectData);
        });
    }, function (msg) {
        console.log('Modal dismissed at: ' + new Date() + 'Message - ' + msg);
    });

1 个答案:

答案 0 :(得分:1)

问题是您正在使用控制器两次,实际上创建了两个范围,因此创建了两个数组:

到达此处:<div class="ibox-content col-lg-10 col-lg-offset-1" ng-controller="LiveCtrl">

第二次来到这里:<div class="col-md-1" ng-controller="LiveCtrl">

因此,较高的一个显示原始费用数组的长度,但实际上是将费用添加到第二个控制器范围的数组中。原始范围内的原始范围保持不变。

您需要做的是删除控制器的最后一个声明,创建:

<div class="row">
    <div class="ibox-content col-lg-10 col-lg-offset-1" ng-controller="LiveCtrl">
        {{expenses.length}}


        <div class="col-md-1">
            <button class="btn btn-link" ng-click="openAddExpenseModal()">
                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add Expense
            </button>
        </div>
    </div>
</div>