【问题标题】:$scope is updated in view and not in controller for angularJs$scope 在视图中更新,而不是在 angularJs 的控制器中
【发布时间】:2013-08-25 15:11:49
【问题描述】:

我在控制器中定义了一个范围,如下所述:

控制器:

var app = angular.module('app', ['ui.select2']);

app.controller('MyCtrl',
  [
    '$scope',
    '$q',
    '$timeout',
    function ($scope, $, $timeout) {
      $scope.data = {};
       $scope.countries = [{
          name : 'India', code : 'IA'
        }, {
          name : 'Israel', code : 'IS'
        }];

        $scope.selectedCountries = [
          'IA'
        ];

        $scope.$watch('selectedCountries', function(newValue, oldValue) {
           console.log ('data');
    });
]);

视图看起来像这样:

<select
        ui-select2
        multiple
        ng-model="selectedCountries"
        data-placeholder="Choose or Search for countries"
        name="countries"
        style="width:200px;">
        <option ng-repeat="country in countries" value="{{country.code}}">{{country.name}}</option>
</select>

现在,当使用选择下拉菜单更改控制器中的值时,值更改会反映在视图中。但是手表永远不会被调用,因为范围没有改变。知道为什么范围没有更新吗?

【问题讨论】:

  • 你能展示一下视图吗?
  • 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包括重现问题的有效代码。
  • 这可能与实际上没有触及 $scope.selectedCountries 变量的视图相关联。您能否向我们展示跟踪问题的完整代码?
  • 我正在使用 Angular js 的 select2 插件,它反映了视图上的变化,而不是控制器中的变化。
  • 更新了我的代码,希望对您有所帮助..

标签: javascript angularjs angularjs-scope jquery-select2


【解决方案1】:

对于观看集合,将true 作为第三个参数传递给$watch,所以它变成:

$scope.$watch('selectedCountries', function(...) {...}, true);

这使得 $digest 递归地遍历集合,而不是仅仅进行引用检查。

或者,如果您有一个深层结构并且您只需要知道底层是否发生了变化(即添加或删除元素),您可以使用 $watchCollection 而不是 $watch。

更新:工作 Plunker(无需深度 $watch() 即可工作):http://www.plnkr.co/edit/VaWBq9?p=preview

【讨论】:

  • $watchCollection() 的行为类似于$watch('...', function() { ...}, true)——换句话说,它进行了“浅层”比较:对于数组,这意味着查看数组项,对于对象映射,这意味着查看属性。浅比较将检测元素是否已添加或删除,但它也会检测是否有任何项目值已更改。这是一个 plunker 显示后者。
  • @insomiac 似乎 select:multiple 每次都替换数组而不是拼接它,因此它可以在没有深度 $watch 的情况下工作:plnkr.co/edit/VaWBq9?p=preview 您的代码似乎在这里工作正常。 @MarkRajcok $watchCollection(..) 很浅,但$watch(.., .., true) 很深。两者都会查看对象或数组的内容是否已更改,但只有后者会查看该内容中的内容是否已更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多