2012-11-20 168 views
20

我有一些數據稱爲foo其住在一個範圍是父母三個孩子:共享數據

<div ng-init="foo=[1, 2, 3]"> 
    <bar foo="{{foo}}" baz="{{odp}}" /> 
    <mpq foo="{{foo}}" bats="{{maktz}}" /> 
    <ktr foo="{{foo}}" otr="{{ompg}}" /> 
</div> 

bar.scope = {foo: '=', baz: '@'}; 
mpq.scope = {foo: '=', bats: '@'}; 
ktr.scope = {foo: '=', otr: '@'}; 

什麼是分享這三個指令之間foo的最佳方式?選項包括:

  • 使用隔離範圍,在foo三次傳球,藉此,複製它在四個範圍
  • 有指令繼承父範圍,孩子找到bazbats,或otrattrs
  • 戴上$rootScopefoo並注入到這一點的孩子指示

還是有另一種方法就是賭注之三?

+3

其他選項可能會使用一個服務,它注射到你的指令,但是這真的取決於你的數據的性質。 –

回答

27

您可以創建一個工廠,您可以傳遞給每個指令或控制器。這將確保您在任何給定時間只有一個數組實例。編輯:這裏唯一的問題是確保你在指令範圍上設置引用類型而不是基元類型,否則你將最終複製每個範圍中的值。

Here is an example on Plnkr.co

app.controller('MainCtrl', function($scope, dataService) { 
    $scope.name = 'World'; 
    //set up the items. 
    angular.copy([ { name: 'test'} , { name: 'foo' } ], dataService.items); 
}); 

app.directive('dir1', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 1</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.directive('dir2', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 2</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.directive('dir3', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 3</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.factory('dataService', [function(){ 
    return { items: [] }; 
}]); 

HTML

<dir1></dir1> 
    <dir2></dir2> 
    <dir3></dir3> 
+2

我考慮過這一點,但角度文檔阻止它:http://docs.angularjs.org/misc/faq –

+4

我認爲你在談論這個:「相反,不要創建一個服務,其唯一的目的是生活是以存儲和返回數據位「。這真的取決於你對數據做什麼。如果你以統一的方式跨控制器/指令/等(大多數人會這樣做)操縱它,然後創建一個服務...否則,只需將其粘貼到$ rootScope中即可。只要你做的事情很容易遵循,最重要的是,不會破壞可測試性,這是猶太教。 –

+0

......正如@ pkowslowski.opensource上面所說:這實際上取決於數據的性質。 –