有一个动态的 html 元素使用 AngularJS 指令 WHITOUT $scope?

Have a dynamic html element using AngularJS Directive WHITOUT $scope?

我想使用 This Plunker 示例代码通过 AngularJS 将一些元素动态添加到 HTML 页面。 (你应该运行它在一个新的link,而不是在编辑器环境)这是我第一次声明AngularJS指令(除了简单的测试)。我有两个关于这个样本的问题:

  1. 我的方法是在我的控制器中使用 Controller as 而不是 $Scope。 (我不知道这种方法的名称!)那么我应该如何处理上面的示例代码呢?因为它使用 $compile(...)($scope)。应该应用哪些更改?
  2. 指令中的范围是否与控制器相关?所以,如果我可以在这种情况下从控制器中省略范围,我是否应该对指令应用任何更改?

1) 当使用contrller作为语法时,$compile(...)($scope)改为$compile(...)(vm)。并且对于所有函数和变量而不是 $scope 使用 vmthis

var vm = this;

所以使用 vm.list 而不是 $scope.list 并且函数也使用

  $scope.do = function() ..

  vm.do = function() ....

2) 在指令中添加 controllerAs 这样的

  app.directive('myDirective', function () {
   return {
   scope: {},
   controller: function () {
     this.name = 'Elnaz'
   },
   controllerAs: 'ctrl',
   template: '<div>{{ctrl.name}}</div>'
  };
});

如果您想引用外部控制器,请使用此

   app.directive('myDirective', function () {
     return {
     restrict: 'A',
     controller: 'EmployeeController',
     controllerAs: 'ctrl',
     template: ''
    };
 });

在你的观点中变成这样:

  <div ng-controller="myController as ctrl">
     {{ctrl.name}}

     <button type="button" ng-click="ctrl.do()">Do</button>
  </div>

编辑: works demo

第 1 点的答案:

  1. 在您的控制器中,您将创建一个代表 "controller as";

    的变量

    var vm = this;

  2. 现在绑定到 $scope 的所有属性现在都将成为 vm 的一部分

  3. 在HTML中: 使用 div 绑定控制器的方法:<div ng-controller="customCntrl as vm"
  4. 现在在视图中而不是直接引用作用域属性,你必须像这样在 vm 之前加上前缀:vm.name
  5. 指令中: 使用 "controller as" 绑定控制器的方法:

    app.directive('customDir', 函数() { return{ 控制器:'customCntrl', 控制器为:'vm', ...

                }
            }); 
    

第二点的答案:

  1. 您仍然可以像这样在 'vm' 上应用广播和发射:

    $scope.$watch('vm.name', 函数() { $scope.$broadcast('topic-123', 'msg'); });

    并捕捉它: $scope.$on('topic-123', function(event, msg) {});