2014-11-13 4 views
0

У меня есть JSBin here с тем, что я пытаюсь сделать. У меня есть контроллер и директива (которые являются братьями и сестрами).angularjs с использованием области контроллера в директиве

Контроллер Я хочу отслеживать состояние нескольких флажков, а директива, которую я хочу заполнить div, с помощью флажков (в моем реальном приложении директива обрабатывает отображение около десятка разных шаблонов). Состояние флажков сохраняется в службе, к которой снова будет обращаться в другой части приложения.

Поскольку я хочу поддерживать синтаксис «контроллер как», а не просто сбрасывать все в $scope, у меня возникают серьезные трудности, обертывая голову вокруг того, что директива использует область управления.

Было бы лучше переместить флажок, переключающий код в директиву, или есть способ включить область управления в директиву? Я пробовал играть с опцией scope без успеха.

Edit: Добавлено код из JSBin здесь:

HTML:

<!DOCTYPE html> 

<html ng-app='MyApp'> 

    <head> 
    <script src='https://code.angularjs.org/1.3.1/angular.js'></script> 
    <script src='http://code.angularjs.org/1.3.1/angular-sanitize.js'></script> 
    <script src='data-service.js'></script> 
    <script src='my-app.js'></script> 
    <script src='my-directives.js'></script> 
    </head> 

    <body ng-controller='MyController as myCtrl'> 
    <div checkbox-template=''></div> 
    Checked boxes: <div ng-repeat='checked in data.checkboxes'>{{checked}}</div> 
    </body> 

</html> 

JavaScript:

моих-directives.js

dir = angular.module('my-directives', []); 

dir.directive('checkboxTemplate', function(){ 
    return { 
    restrict: 'A', 
    template: "<ul><li ng-repeat='cb in data.tpl1' ng-bind-html='myCtrl.renderHtml(cb)'></ul>" 
    }; 
}); 

данных service.js :

dat = angular.module('data-service', []); 

dat.service('DataService', function() { 
    return { 
    checkboxes: [], 
    tpl1: [ 
     "<label><input type='checkbox' value='1' ng-click='boxToggle(1)' ng-checked='data.checkboxes.indexOf(1) > -1'/>Checkbox 1</label>", 
     "<label><input type='checkbox' value='2' ng-click='boxToggle(2)' ng-checked='data.checkboxes.indexOf(2) > -1'/>Checkbox 2</label>" 
     ] 
    }; 
}); 

мои-app.js:

app = angular.module('MyApp', ['ngSanitize', 'my-directives', 'data-service']); 

app.controller('MyController', ['$scope', '$sce', 'DataService', function($scope, $sce, DataService) { 
    this.data = DataService; 
    self = this; 

    this.renderHtml = function(raw_html){ 
    return $sce.trustAsHtml(raw_html); 
    }; 

    this.boxToggle = function(idx) { 
    i = this.data.checkboxes.indexOf(idx); 
    alert('Toggling Checkbox'); 

    if (i > -1) { 
     this.data.checkboxes.splice(i,1); 
    } else { 
     this.data.checkboxes.push(idx); 
    } 
    }; 
}]); 
+0

Вы могли бы сделать что-то подобное http://jsfiddle.net/bgr1ofyo/. Ссылка: http://stackoverflow.com/questions/17417607/angular-ng-bind-html-unsafe-and-directive-within-it. – themyth92

+0

отличное решение! работает так, как я пытался его получить. – wikenator

ответ

0

Вы хотите использовать & scope option в пределах вашей директивы, чтобы позволить ему вызывать функции, определенные в родительской области.

+0

После включения опции «scope» в моей директиве флажки больше не отображаются. Я попробовал добавить 'require: '^ ngController'' и' scope: {data:' = '} 'в директиве' checkboxTemplate', но я все еще не уверен, как получить директиву для совместного использования 'MyController' объем. – wikenator

Смежные вопросы