【问题标题】:angularJS $scope change not updating viewangularJS $scope 更改不更新视图
【发布时间】:2016-03-13 23:27:38
【问题描述】:

我一直在努力解决 angularJS $scope 问题。我有一个在控制器函数中更新的数组。根据我的控制台日志,其中的值确实发生了变化。但是,视图没有更新。这是sn-ps。

//array initialisation

    $scope.fieldSuggestions = []

//modifying function

  $scope.changeCurrentInput = function(fieldName, eye) {
    for(var field in $scope.test){
      console.log($scope.test[field].name)
      if($scope.test[field].name === fieldName){
        console.log($scope.test[field].values)
        console.log("be4 update")
        console.log($scope.fieldSuggestions)
        $scope.fieldSuggestions = $scope.test[field].values;
        console.log("after update")
        console.log($scope.fieldSuggestions)
      }
    }
  };

//view

 <div ng-repeat="choice in fieldSuggestions">       
    <button class="button button-positive">{{choice}}</button>
</div>

更多细节...

我认为这可能是相关的。我有一个父视图和几个子视图。这些路由中的每一个都使用相同的控制器。即:routes.js 中的属性控制器对所有人都是一样的。调用修改函数的按钮在子视图中,而未更新的ng-repeat在父视图中。

【问题讨论】:

  • 如果在列表中推送或拼接会发生什么?那么视图更新了吗?
  • @Patrick 不,视图也不会通过推送更新。
  • 您是否正在更改摘要周期中的值?您如何以及何时调用该函数?
  • @Patrick 我通过 ng-click 按钮调用该函数。请参阅我在问题中发布的额外详细信息。
  • 嗯,好的。如果您要“共享”变量,则应使用服务,以便在控制器之间获得相同的变量引用。如果它们相互继承,则需要将变量放在“模型”变量中,即$scope.model = { fieldSuggestions: [] } 以避免variable shadowing

标签: javascript angularjs


【解决方案1】:

由于您正在更改嵌套属性,Angular 不会触发摘要。您可以通过添加 linkcontroller 函数来解决这个问题:

$scope.$watchCollection('fieldSuggestions', function(newFieldSuggestions, oldFieldSuggestions) {
  $scope.fieldSuggestions= newFieldSuggestions;
}); 

需要指出的一点:对于大型集合和复杂对象,这可能不是最佳选择。

【讨论】:

  • 我在哪里添加这个?试了几个点都没有成功。你确定我在“改变嵌套属性”吗?我不是在修改 $scope.test,而是在修改 $scope.fieldSuggestions。
  • 在指令中的 controller/link 函数中。
  • 感谢您的宝贵时间,但它似乎不起作用。我将它添加到我的控制器功能中。在 angular.module('examWriteCtrl', []).controller('examWriteCtrl', ['$scope', ...
【解决方案2】:

原来我通过将我的子控制器声明为与父控制器相同来隐藏父 fieldSuggestions 变量。解决方案是不要在子路由上重新声明控制器,因为它会自动看到父路由。

感谢所有帮助过的人。

【讨论】:

    【解决方案3】:

    我认为由于嵌套更改,当时无法更新值。您可以使用 $scope.$apply() 获取最新更新的值 比如.... $scope.$apply($scope.fieldSuggestions = $scope.test[field].values);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 2016-10-08
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      相关资源
      最近更新 更多