Angularjs 数据模型更改时,ngSwitch不更新

Angularjs 数据模型更改时,ngSwitch不更新,angularjs,angularjs-directive,angularjs-ng-switch,Angularjs,Angularjs Directive,Angularjs Ng Switch,我对Angular还不熟悉,正在尝试编写一些简单的应用程序。 我在使用ngSwitch按需切换相应指令时遇到问题,如下所示 html标记: 主html文件: 方向一: .directive('directiveOne',function(){ return { restrict:"AE", replace:true, template:"<div>this is directive one</div>", con

我对Angular还不熟悉,正在尝试编写一些简单的应用程序。 我在使用ngSwitch按需切换相应指令时遇到问题,如下所示

html标记:

主html文件: 方向一:

.directive('directiveOne',function(){
      return {
      restrict:"AE",
      replace:true,
      template:"<div>this is directive one</div>",
      controller:"Dir1Controller",
      }
})
.directive('directiveTwo',function(){
      return {
      restrict:"AE",
      template:"<div>this is directive 2</div>,
      controller:"Dir2Controller"
      }
})
最后是指令的3个控制器

.controller('MainController',function($scope,ShareDataFct){
            $scope.$watch('varChanged',function(){
            $scope.myvar=ShareDataFct.var;
            })
      })
.controller('Dir1Controller',function($scope){
  //nothing to do here yet
      })
  .controller('Dir2Controller',function($scope){
  //nothing to do here yet
  })
然后我尝试更改ShareDataFct变量,但是视图(ng开关)没有根据myvar的更改来显示指令。
请告知。谢谢。

实际上你有几个问题

第一:您正在使用$rootscope.$broadcast,并尝试使用$watch捕捉结果

您应该使用$scope.$on而不是watch

第二:永远不要尝试使用$rootscope、$broadcast和$watch更新vars。如果你试图这么做,那你就是做错了

怎么做?直接从您的工厂共享var即可

app.factory('ShareDataFct',function(){
  var srv={};
  srv.data={};
  srv.data.value="";//init your value here
  return srv;
})
在控制器中,您可以如下方式绑定它:

  .controller('MainController',function($scope,ShareDataFct){
        $scope.data=ShareDataFct.data;
  })
  <div>{{data.value}}</div>
在您看来,可以这样使用它:

  .controller('MainController',function($scope,ShareDataFct){
        $scope.data=ShareDataFct.data;
  })
  <div>{{data.value}}</div>
{{data.value}
在您的ng交换机中:

  <div ng-switch on="data.value">
     <div ng-switch-when="Test"> This is a test</div>
     <div ng-switch-when="TestAgain"> This is a test ... again !</div>
  </div>

这是一个测试
这是一个测试。。。再一次
请注意,共享对象而不是原语值很重要,因为更新该值会删除引用,并且不会在应用程序的其他部分更新

下面是一个工作示例

希望有帮助


编辑:添加了plunker

您可以添加ng开关吗?感谢您的快速响应。但是如果我想从另一个控制器更改ShareDataFct,并且它将在主控制器上自动更新,那该怎么办呢?是的:)!如果使用相同类型的绑定$scope.data=ShareDataFct.data;在您的其他控制器中,当您更新工厂中的值时,它将更新链接到它的所有值,无论您绑定到何处(控制器、服务、工厂、指令等)。谢谢verymuch Okazari。事实上,我花了一段时间才解决这个问题。我在服务中使用一个函数(setter)来更改服务中var的值,这样它就不会更新——不知道为什么。无论如何,控制器中服务变量的赋值对我来说是有效的。非常感谢您的帮助。@user804293实际上这也应该适用于setter。只是口味的问题。关键是引用包含基元值的对象,而不是基元值本身,以避免引用丢失。