当前位置: 首页 > 面试题库 >

在控制器外部访问ng-model数据

汪胡非
2023-03-14
问题内容

我写了下面的代码

<span ng-controller="calanderCtrl">
<input type="text" ng-model="onDate">
</span>  
<pre>user.name = <span ng-bind="onDate"></span></pre>

我知道它在ng-
controller之外,因此我无法绑定数据,但是我的应用程序需要calanderCtrl控制器。我想将此值置于范围内,以便我也可以在其他控制器中使用它。我该怎么做呢?


问题答案:

您可以为此使用发布订阅模式。这样,您避免将变量放在rootscope上。

function Ctrl($scope) {
    $scope.onDate = "12/01/2015";

    $scope.$watch('onDate', function(newValue, oldValue) {
     $scope.$emit('onDateChanged', newValue);
    });
 }

function Ctrl2($scope, $rootScope) {
   $scope.onDate = "";

   $rootScope.$on('onDateChanged', function(event, value) {
   $scope.onDate = value;
   });
}

模板加载时,控制器将被调用。

<span ng-controller="Ctrl">
<input type="text" ng-model="onDate">
</span>  
<pre>user.name = <span ng-controller="Ctrl2" ng-bind="onDate"></span></pre>

现在如何运作:

Angular不共享范围。每个控制器都有自己的单独作用域。因此,为了使我们的子级示波器保持最新状态,我们需要以某种方式引发一个我们的子级订阅的事件。这可以通过两种方式完成。

$scope.$emit 要么 $rootScope.$broadcast

两者之间的区别是微妙的。

$ scope。$ emit将事件发送到整个链。因此,例如考虑此范围层次结构。

rootscope
    scope1 ---> subscribes to the emit $scope.$on
      scope2 ---> performs a $scope.$emit
        scope3 ---> subscribes to the emit $scope.$on

只有scope1会捕获事件。从$ scope。$ emit开始。这是仅更新特定范围的一种方法。尽管主要是这样做的。

rootscope
        scope1 ---> subscribes to the emit $rootScope.$on
          scope2 ---> performs a $scope.$emit
            scope3 ---> subscribes to the emit $rootScope.$on

我们将$
rootScope注入scope1和scope3的控制器中,并订阅rootscope上的emit。由于rootscope是最高范围,因此它将始终从scope2捕获$
emit。这是一种仅将事件发送到在rootscope上进行订阅的特定控制器的方法。

最后,我们也可以这样做:

 rootscope
            scope1 ---> subscribes to the emit $scope.$on
              scope2 ---> performs a $rootScope.$broadcast
                scope3 ---> subscribes to the emit $scope.$on

现在,我们在rootscope上大喊大叫,而不是像发射一样向上移动,而是向下广播。这相当于在房间里大喊大叫,没有戴耳罩的每个人都会听到。本质上,每个在本地范围内订阅广播正在发送的事件的人



 类似资料:
  • 问题内容: 我有上面的控制器,它设置了一个我只能从内部访问值的控制器。 但我看到的地方,使用下面我将能够访问,但是当我在它不存在。 我无法弄清楚如何访问$ scope并使用变量更新它。 问题答案: 没有看到标记,我想MenuSideController的作用域是您选择的作用域的子作用域。 虽然可以像这样遍历树(假设我们想要的作用域是第一个孩子): 仅选择连接了特定控制器的元素会更简单。 假设您正在

  • 问题内容: 我正在使用离子型,并且具有以下视图: 而我的控制器: 我不明白的是,当我单击按钮时,登录功能被正确调用。另外,如果我在控制器中设置为“香蕉煎饼”之类的内容,则视图实际上会更新。 但是,当登录功能实际运行时,会提示未定义MembershipNo和密码。我是Angular和Ionic的新手,所以我知道这可能是一些n00b错误… 问题答案: 修改后的报价: “如果使用ng-model,则必须

  • 问题内容: 我正在尝试通过常规函数访问全局变量,这可能吗? 我已经使用$ rootScope设置了一些变量,并且我试图通过回调函数来访问它。从控制器调用此回调。我不想传递该回调。 有什么办法可以访问吗? 我愿意使用服务。 请提出建议。 谢谢 我试图按以下方式访问rootScope: 我的服务是: 它在updateStatus fn下显示isFBLoggedin为true,但未反映在视图上 我正在打

  • 问题内容: 我正在尝试使用生成一个可编辑列表。我想提醒用户在继续操作之前更新所有编辑内容,因此我正在使用中动态创建“嵌套”表单,因为文档说我可以在这些动态创建的输入上使用验证。 尽管这似乎可以在HTML中运行,但我看不到如何在控制器中访问那些动态创建的表单和相关的验证字段。具体来说,当用户更改输入时,我使用$ dirty属性形式调出一个按钮来告诉用户提交更改。到目前为止,一切都很好。但是,一旦提交

  • 外部访问容器 容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。 当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。 使用 docker container ls 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应