具有共享数据模型的Angular多指令

时间:2016-02-23 20:34:04

标签: javascript angularjs

这篇文章的主要观点是我想避免使用$ scope。$ watch,因为它被教会导致性能下降。

所以想象一下,有一个共享的视图部分/模板,称之为" mypage"使用两个不同的指令,将它们称为" directive1"和" directive2",在共享数据模型的地方,我们可以调用它" awesomeData"

也许它看起来像这样:

<div class="mypage-root">
   <directive1 shared-data="awesomeData"></directive1>
   <directive2 shared-data="awesomeData"></directive2>
</div>

现在显然是&#34; awesomeData&#34;无论是指令还是根视图中的更改,其他部分的数据都会发生变化(假设它是双向绑定的)。

但是如果我想在directive2更新数据模型时在directive2中发生其他事情,比如在directive2中调用一个函数呢?

我可以使用观察者,但如上所述,这是性能下降。

还有哪些其他方法以及&#34; true&#34;有角度的方式来做到这一点?

1 个答案:

答案 0 :(得分:0)

我知道你在没有观察者的情况下询问如何做到这一点,但我认为在这种情况下,观察者是最好的答案,因为它给出了关注的分离。 directive1不应该知道directive2,而只能了解MySharedService及其可能播放的任何内容:

$rootScope.$broadcast('myVar.updated');

...

$scope.$on('myVar.updated', function (event, args) {
});

修改

此外,根据指令将使用的模型的复杂性,您可以从其父控制器传递此模型(向下,这是您必须从父实例化实例化模型):

HTML:

<!DOCTYPE html>
<html ng-app="app">
  <head>
    <script data-require="angularjs@1.4.9" data-semver="1.4.9" src="https://code.angularjs.org/1.4.9/angular.min.js"></script>
    <script src="script.js"></script>
  </head>
  <body ng-controller="MyCtrl">
    <directive1 my-model="model"></directive1>
    <directive2 my-model="model"></directive2>
  </body>
</html>

JS:

var app = angular.module('app', []);

app.controller('MyCtrl', function($scope) {
  $scope.model = { info: 'Starting...' };
});

app.directive('directive1', function() {
  var controllerFn = function($scope) {
    $scope.changeInfo = function() {
      $scope.vm.myModel.info = 'Directive 1';
    };
  };

  return {
    restrict: 'E',
    controller: controllerFn,
    template: '<div><span>hello</span> <span ng-bind="vm.myModel.info"></span> <button ng-click="changeInfo()">Click</button></div>',
    controllerAs: 'vm',
    bindToController: true,
    scope: {
      myModel: '='
    }
  }
});

app.directive('directive2', function() {
  var controllerFn = function($scope) {
    $scope.changeInfo = function() {
      $scope.vm.myModel.info = 'Directive 2';
    };
  };

  return {
    restrict: 'E',
    controller: controllerFn,
    template: '<div<span>bye</span> <span ng-bind="vm.myModel.info"></span> <button ng-click="changeInfo()">Click</button></div>',
    controllerAs: 'vm',
    bindToController: true,
    scope: {
       myModel: '='
    }
  }
});

plunker:https://plnkr.co/edit/EwdHFl7eZl2rd43UVG4J?p=preview

编辑2:

与方法2一样,您可以拥有一个提供此model

的共享服务

plunker:https://plnkr.co/edit/EwdHFl7eZl2rd43UVG4J?p=preview