这篇文章的主要观点是我想避免使用$ 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;有角度的方式来做到这一点?
答案 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