AngularJS - 我如何以编程方式创建一个新的,孤立的范围是什么?(AngularJS -

2019-07-22 12:42发布

我想创建一个Angular.factory AlertFactory。 我定义的HTML模板一样遵循

var template = "<h1>{{title}}</h1>";

标题是由呼叫控制器提供,并且如下施加

var compiled = $compile(template)(scope);
body.append(compiled);

那么,如何我可以从控制器通过隔离范围,以工厂? 我使用的控制器后续代码

AlertFactory.open($scope);

但是$范围是全球性的控制范围变量。 我只是想传递一个小范围的工厂只是title属性。

谢谢。

Answer 1:

您可以手动创建一个新的范围。

您可以从一个新的范围$rootScope ,如果你把它注射,或只是从您的控制器范围-这不应该的问题,你会使其隔离。

var alertScope = $scope.$new(true);
alertScope.title = 'Hello';

AlertFactory.open(alertScope);

这里的关键是通过true$new ,它接受一个参数isolate ,避免了从父继承范围。

:更多信息可以在这里找到http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$new



Answer 2:

如果你只需要插事物,用$插值服务,而不是$编译,然后你就不会需要一个范围:

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');
}

小提琴



Answer 3:

以下是具体步骤:

  1. 通过使用HTML添加到DOM var comiledHTML = angular.element(yourHTML);
  2. 如果你想创建一个新的Scope var newScope = $rootScope.$new();
  3. 调用$ comile(); 函数返回链路功能var linkFun = $compile(comiledHTML);
  4. 通过调用linkFun绑定新范围var finalTemplate = linkFun(newScope);
  5. 附加finalTemplate您DOM YourHTMLElemet.append(finalTemplate);


Answer 4:

看看我的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);
    }
  }
}


Answer 5:

当你谈论你是在谈论一个指令的分离范围我承担。

这里是如何做到这一点的例子。 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可以通过分离范围。



文章来源: AngularJS - How can I create a new, isolated scope programmatically?