1

我有一个我似乎无法解决的具体问题。

在 html 中,我有以下代码:

<select ng-model="$parent.proizvod"  ng-options="i.id_proizvod as i.proizvod for i in proizvodiServer">
   <option>Select</option>
 </select>

在我的控制器中:

  $rootScope.proizvod = '1';

所以当页面第一次加载时,第一个选项被选中。如果我将其更改$rootScope.proizvod = '1';$rootScope.proizvod = '3';它将加载第三个选项。

现在,当您选择其他值时,它会将其存储在 中$rootScope.proizvod,但稍后,在某些功能中,我想将其重置$rootScope.proizvod回 '1' 并且它似乎不起作用。

我在这里想念什么?

PS没有$parent.proizvod,我的选择甚至不会改变 $rootScope.proizvod值。

编辑:这是另一个功能:

$rootScope.upisPodataka = function() {
      setTimeout(function () {
      $rootScope.proizvod = '1';
      $scope.$apply();
       }, 2000);
      $state.go('app.podesenost_grilla', {}, {
        reload: true
      });

upisPodataka 函数在单击按钮时被调用。

4

1 回答 1

1

ng-model='$parent.proizvod'不保证$rootScope在所有情况下都能更新使用。

新的 AngularJS 开发人员通常没有意识到 , ng-repeat,ng-switchng-viewng-include创建ng-if了新的子作用域,所以当涉及到这些指令时问题经常出现。

AngularJS Wiki - 理解范围

如果ng-model在子范围内设置值。子作用域拥有自己的属性,该属性隐藏/隐藏同名的父属性。这不是 AngularJS 正在做的事情——这就是 JavaScript 原型继承的工作方式。阅读维基。

那么问题就变成了应该是$parent.$parent.proizvod吗?或者也许$parent.$parent.$parent.proizvod?通过反复试验来做到这一点?

更强大的方法是使用ng-change 指令来更新变量。

<select ng-model="vm.proizvod" ng-change="vm.update()"
        ng-options="i.id_proizvod as i.proizvod for i in proizvodiServer">
   <option>Select</option>
</select>
vm.update = function () {
    $rootScope.proizvod = vm.proizvod;
    console.log($rootScope.proizvod);
});

$rootScope考虑使用自定义服务来存储变量,而不是使用。

$rootScope存在,但可以用来作恶

AngularJS 中的作用域形成一个层次结构,原型继承自树顶部的根作用域。通常可以忽略这一点,因为大多数视图都有自己的控制器,因此也有自己的范围。

有时,您想让某些数据对整个应用程序具有全局性。$rootScope对于这些,您可以像任何其他范围一样在其上注入和设置值。由于作用域从根作用域继承,这些值将可用于附加到指令的表达式,就像ng-show本地 $scope 上的值一样。

当然,全局状态很糟糕,您应该$rootScope谨慎使用,就像(希望)在任何语言中使用全局变量一样。特别是,不要将其用于代码,仅用于数据。如果您想在 上放置一个函数$rootScope,最好将它放在一个可以在需要的地方注入并且更容易测试的服务中。

相反,不要创建一个生活中唯一目的是存储和返回数据位的服务。

— AngularJS 常见问题


使用 $timeout 而不是 window.setTimeout

$rootScope.upisPodataka = function() {
      //setTimeout(function () {
      $timeout(function () {
         $rootScope.proizvod = '1';
         //$scope.$apply();
      }, 2000);
      $state.go('app.podesenost_grilla', {}, {
        reload: true
      });
};

$timeout 服务windows.setTimeout其与 AngularJS 框架及其摘要循环进行包装和集成。那么$apply()就不需要了。

此外,$timeout.flush()可以在测试时使用。

于 2017-03-11T17:53:37.920 回答