Я хочу создать AlertFactory с Angular.factory. Я определил шаблон html, например, follow
var template = "<h1>{{title}}</h1>";
Заголовок предоставляется вызывающим контроллером и применяется следующим образом
var compiled = $compile(template)(scope);
body.append(compiled);
Итак, как я могу передать изолированную область видимости от контроллера к фабрике? Я использую в контроллере следующий код
AlertFactory.open($scope);
Но $ scope - это глобальная переменная области действия контроллера. Я просто хочу передать небольшую область для factory с одним свойством title.
Спасибо.
источник
$scope
уничтожаетсяalertScope
, автоматически уничтожается. Итак, @MarkRajcok - это вполне допустимый вариант использования и совершенно безопасный.Если вам нужно только интерполировать вещи, используйте службу $ interpolate вместо $ compile, и тогда вам не понадобится область видимости:
myApp.factory('myService', function($interpolate) { var template = "<h1>{{title}}</h1>"; var interpolateFn = $interpolate(template); return { open: function(title) { var html = interpolateFn({ title: title }); console.log(html); // append the html somewhere } } });
Контроллер тестирования:
function MyCtrl($scope, myService) { myService.open('The Title'); }
Скрипка
источник
Следующие шаги:
var comiledHTML = angular.element(yourHTML);
var newScope = $rootScope.$new();
var linkFun = $compile(comiledHTML);
var finalTemplate = linkFun(newScope);
YourHTMLElemet.append(finalTemplate);
источник
var linkFun = $compile(comiledHTML);
on step 2проверьте мой plunkr. Я программно генерирую директиву виджета с директивой рендеринга.
https://plnkr.co/edit/5T642U9AiPr6fJthbVpD?p=preview
angular .module('app', []) .controller('mainCtrl', $scope => $scope.x = 'test') .directive('widget', widget) .directive('render', render) function widget() { return { template: '<div><input ng-model="stuff"/>I say {{stuff}}</div>' } } function render($compile) { return { template: '<button ng-click="add()">{{name}}</button><hr/>', link: linkFn } function linkFn(scope, elem, attr) { scope.name = 'Add Widget'; scope.add = () => { const newScope = scope.$new(true); newScope.export = (data) => alert(data); const templ = '<div>' + '<widget></widget>' + '<button ng-click="export(this.stuff)">Export</button>' + '</div>'; const compiledTempl = $compile(templ)(newScope); elem.append(compiledTempl); } } }
источник
Я предполагаю, что когда вы говорите об изолированной области видимости, вы говорите о директиве.
Вот пример того, как это сделать. http://jsfiddle.net/rgaskill/PYhGb/
var app = angular.module('test',[]); app.controller('TestCtrl', function ($scope) { $scope.val = 'World'; }); app.factory('AlertFactory', function () { return { doWork: function(scope) { scope.title = 'Fun'; //scope.title = scope.val; //notice val doesn't exist in this scope } }; }); app.controller('DirCtrl', function ($scope, AlertFactory) { AlertFactory.doWork($scope); }); app.directive('titleVal',function () { return { template: '<h1>Hello {{title}}</h1>', restrict: 'E', controller: 'DirCtrl', scope: { title: '=' }, link: function() { } }; });
По сути, прикрепите контроллер к директиве, которая определила область изолирования. Область видимости, введенная в контроллер директивы, будет изолированной областью. В контроллере директив вы можете ввести свой AlertFactory с помощью которого вы можете передать область изолированной области.
источник