【问题标题】:Scope variables not inherited to child controllers from state parent controller范围变量未从状态父控制器继承到子控制器
【发布时间】:2015-03-19 09:35:57
【问题描述】:

我在 Ionic 框架中执行此操作。它以home.html 模板和eventmenu.home 状态开始。 $scope.aaa 变量是 10,它正确显示了该值。但是,在该模板的子控制器 TestCtrl 中,我无法更改 $scope.aaa 值并对其进行更新。 我的方法有什么问题,为什么aaa 没有增加TestCtrl 是否与 HomeCtrl 处于不同的范围内,尽管它应该是 HomeCtrl 的子级,不是吗?

代码:

http://codepen.io/hawkphil/pen/xbmZGm

HTML:

<script id="templates/home.html" type="text/ng-template">
      <ion-view view-title="Welcome" >
        <ion-content class="padding" >
          <p>Swipe to the right to reveal the left menu.</p>
          <p>(On desktop click and drag from left to right)</p>
          <p>{{ aaa }}</p>
          <div ng-controller="TestCtrl">
            <a ng-click="clickMe()" href="">Click Me</a>
          </div>
        </ion-content>
      </ion-view>
    </script>

JS:

.controller('HomeCtrl', function($scope) {
    $scope.aaa = 10;
})

.controller('TestCtrl', function($scope) {
    $scope.clickMe = function() {
    $scope.aaa++;
  }
})

p.s 我正在使用别人的代码,所以请忽略其他内容。

【问题讨论】:

  • 为什么不直接使用服务呢?除非我在这里遗漏了什么?此外,您提供的此代码不反映您链接到的代码笔
  • 我可以使用服务,但这不是问题。我的问题是关于 $scope 的继承原则。看我的附言

标签: javascript angularjs angularjs-scope angular-ui-router ionic-framework


【解决方案1】:

这对于 Ionic、ui-router 甚至 Angular 都不是问题。这就是 javascript 的工作原理。

您可以使用ng-if 在普通 Angular 中看到相同的问题。这与 javascript 继承的工作原理有关。

如果子作用域没有它的自己的 aaa 属性,它使用它的父作用域。但是,一旦您单击该按钮,您就会将其设为 自己的 属性,比父级的属性多一个。但现在它们是独立的属性,父级的aaa 和子级的aaa

示例

您可以在这里看到一个纯 JavaScript 示例... Example。尽可能多地单击Inc Parent,父显示和子显示都会递增。单击Inc Child 会断开连接。一旦连接断开,您可以通过单击Unhide 按钮删除子属性来“取消隐藏”父值。

代码

var obj = function () {}
obj.aaa = 10
obj.inc = function () {
  this.aaa += 1;
};

var objB = function () {};
objB.__proto__ = obj; // Make objB a child of obj
objB.inc = function () {
  this.aaa += 1;
};
objB.unhide = function () {
  delete this.aaa;
};

var update = function () {
  document.getElementById("p").textContent = obj.aaa;
  document.getElementById("c").textContent = objB.aaa;
};
update();

html

<button onclick="obj.inc(); update();">Inc Parent</button>
<button onclick="objB.inc();  update();">Inc Child</button>
<button onclick="objB.unhide();  update();">Unhide</button>

<p>
  Parent's value: <span id="p"></p>
</p>
<p>
  Child's value: <span id="c"></p>
</p>

【讨论】:

  • 我理解这个逻辑,但我不明白为什么 Angular 不自动重用父变量。我决定就此发布一个单独的问题,关于如何在 Angular 应用程序中修复此逻辑。 stackoverflow.com/questions/29160182/…
  • @HP。 - 他们为什么要改变任何东西?这是 javascript 中的预期行为。改变它的行为方式会让很多 javascript 程序员想知道发生了什么。
【解决方案2】:

每个控制器都有自己的$scope 对象。子控制器可以使用$parent 访问其父控制器:

.controller('TestCtrl', function($scope) {
    $scope.clickMe = function() {
        $scope.$parent.aaa++;
    }
})

codepen

【讨论】:

  • 但原则上,作用域变量是从父级继承的。为什么不在这种情况下?我做了什么不同的事情?
  • 这是解决问题的方法,但不是对问题所在的解释。
猜你喜欢
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多