【问题标题】:angularjs directive + apply scope value in many controllerangularjs 指令 + 在许多控制器中应用范围值
【发布时间】:2016-10-08 11:27:24
【问题描述】:

在 angularjs 中使用指令时如何将范围(隔离范围)值更新应用到多个控制器中。

例如:

我在视图页面中有很多模板:

  1. 左侧菜单模板
  2. 顶部菜单模板
  3. 正确的内容模板。

上面的东西使用ui-router插件。 在这种情况下,正确的内容具有控制器名称是 ordersController.

左侧菜单模板:

<a ng-custom-click  data="data" href="#/order"> Orders </a> 

列表 ..等

app.controller('myapp', function($scope){

  $scope.data = {
            list : true,
            details : false,
            test : "rk controller"
        };
}

指令代码:

app.directive('ngCustomClick', function() {
    return {
        restrict : 'A',
        replace : false,
        controller : 'ordersController',
        scope : {
            data : '='
        },
        link : function(scope, el, attrs) {
            el.bind('click', function(e) {
                scope.data = {
                 list : false,
                 details : true,
                 test : "abcd directive"
              };
            });
        }
    };
});

这里的ordercontroller与左侧菜单模板没有关系。

所以当点击链接意味着scope.data值需要在ordercontroller中改变。

【问题讨论】:

    标签: javascript angularjs angularjs-directive scope


    【解决方案1】:

    不,那行不通。

    对于您使用的每个指令,将创建一个具有自己的 $scope 的新控制器。所以他们不共享数据。您需要使用服务共享它们

    这是一个有效的 sn-p

        var app = angular.module("app",[]);
        app.service('myService', function(){
           this.data = {
                    list : true,
                    details : false,
                    test : "rk controller"
                };
          return this;
        });
        app.controller('myapp2', function($scope, myService){
    
          $scope.dataOrders = myService.data;
          //optionnal if you want to save change from you order to the service
          $scope.$watch('dataOrders', function(newValue){
              myService.data = newValue;
          });
          // if service's data change resync it
          $scope.$watch(function(){return myService.data;}, function(newValue){
               $scope.dataOrders = newValue;
          });
        }
        );
        app.directive('ngCustomClick', function(myService) {
            return {
                restrict : 'A',
                replace : false,
                scope : {
                   
                },
                link : function(scope, el, attrs) {
                    el.bind('click', function(e) {
                        myService.data = {
                         list : false,
                         details : true,
                         test : "abcd directive"
                      };
                      scope.$apply();
                    });
                }
            };
          });
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
        <div ng-app="app">
          <div>
              <a ng-custom-click href="#/order"> Orders </a> 
         </div>
         <div ng-controller="myapp2">
            Orders : {{dataOrders}} 
          </div>
       </div>

    【讨论】:

    • 您好,感谢您的回复。 订单 此代码在左侧菜单中可用。但我需要更改 ordersController 中的值。
    • 您的意思是您的订单控制器位于页面的其他位置?
    • 是的。左侧菜单 html 中没有关系。我在这里附上了我的代码。但代码不起作用。 plnkr.co/edit/yYoXo63cQy66d061xFnT?p=preview
    • 我理解你的代码。但在我的情况下略有不同。请帮助我,我不知道。现在更新了我的所有代码。 plnkr.co/edit/yYoXo63cQy66d061xFnT?p=preview
    • 我编辑了我的帖子,这次你可以看到控制器被声明在其他地方使用了该指令。正如我在原帖中所说,控制器在每次使用时都会被实例化,所以你不能像这样使用 htme,你必须使用服务来共享数据并观察变化。
    猜你喜欢
    • 2015-01-11
    • 2013-05-28
    • 2016-03-28
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 2021-09-28
    相关资源
    最近更新 更多