Javascript 在Angular JS中创建自定义模块的一般步骤

Javascript 在Angular JS中创建自定义模块的一般步骤,javascript,angularjs,angularjs-directive,angular-ui,angular-ui-bootstrap,Javascript,Angularjs,Angularjs Directive,Angular Ui,Angular Ui Bootstrap,我正在尝试创建一个自定义模块,它与ui.bootstrap库中提供的模式非常相似。我希望能够通过服务打开和关闭它,并传递一些选项。问题是,我对angular有点陌生,我不完全确定应该怎么做 我读过关于如何创建自定义模块的书(这是一个很好的例子),我知道我需要一个服务来以编程方式打开它,但是在查看了的源代码之后,我有点不知所措。我假设我需要做以下工作: 构建一个服务以将元素附加到主体 该元素应该有一个将触发。。。什么 但当我尝试这样做时,指令实际上并没有联系起来。例如: angular.mod

我正在尝试创建一个自定义模块,它与ui.bootstrap库中提供的模式非常相似。我希望能够通过服务打开和关闭它,并传递一些选项。问题是,我对angular有点陌生,我不完全确定应该怎么做

我读过关于如何创建自定义模块的书(这是一个很好的例子),我知道我需要一个服务来以编程方式打开它,但是在查看了的源代码之后,我有点不知所措。我假设我需要做以下工作:

  • 构建一个服务以将元素附加到主体
  • 该元素应该有一个将触发。。。什么
但当我尝试这样做时,指令实际上并没有联系起来。例如:

angular.module("ui.sidePanel", [])
.service("$sidePanel", function($rootScope, $document){
  return{
    open: function(options){
        angular.element($document[0].body).append("<side-panel></side-panel>");
        console.log('Boop');
    }
  }
})
.directive("sidePanel", function(){
  return {
    restrict: "E",
    link: function(scope, element, attrs){
        console.log('Side Panel');
    }
  }
})
angular.module(“ui.sidePanel”,[])
.service(“$sidePanel”,函数($rootScope,$document){
返回{
打开:功能(选项){
元素($document[0].body).append(“”);
console.log('Boop');
}
}
})
.指令(“侧面板”,函数(){
返回{
限制:“E”,
链接:函数(范围、元素、属性){
控制台日志(“侧面板”);
}
}
})

永远不会记录“侧面板”。

仅附加html对于您的目的来说是不够的,您还需要编译html(使用
$compile
)以便它运行指令

// In the $modal service
      function getTemplatePromise(options) {
        return options.template ? $q.when(options.template) :
          $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {
            return result.data;
          });
      }
尽管如此,我还是建议使用另一种方法,即服务不操纵dom,因为这不是最佳实践

您的服务可以保持模态的状态,您的指令可以查看模态并选择要显示的内容。我创造了一个你可以玩的游戏

该服务只是保存了一个值,供modal查看

myApp.factory('service', function () {
    return {    
        value: {
            data: ''
        }
    };
});
该指令限定该值的范围,因此它知道何时显示该值

link: function ($scope, $element, $attrs) {
    $scope.value = service.value;
}
现在,无论何时设置服务的值,指令都可以相应地进行调整

编辑:一些ui.bootstrap代码

他们似乎在使用服务获取模板URL,并将其作为内容传递给指令

// In the $modal service
      function getTemplatePromise(options) {
        return options.template ? $q.when(options.template) :
          $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) {
            return result.data;
          });
      }
如果你想投入更多的精力,你可以查看他们的网站


希望这有帮助

几张便条。首先,用$prefix来命名你自己的东西是不好的做法——这是为棱角核心的东西保留的。第二,您很可能不想继续追加DOM节点,intead编写由指令控制的DOM节点,ng hide/ng show基于状态。最后,在您的示例中,没有调用$sidePanel.open()@mattpilleggi我想您是对的,我只是尝试使用ui.bootstrap的示例。你完全正确,我不想继续附加DOM节点,但我希望有比ng show/ng hide更优雅的东西,因为我想重用这个多个位置。也许编写一个指令是最好的方法。我记得我对自己通过
服务将元素附加到DOM有点反感,但我不知道如果不在模板中粘贴
标记,该怎么做。我可能应该接受它并按照你所描述的方式去做,但我仍然很想知道ui.bootstrap是如何做到的。我在我的回答中添加了一些关于ui.bootstrap的小贴士。