从 javascript 为 angular 指令生成 html 绑定模板

Generate html binding template for angular directive from javascript

我最近写了几个单元测试,我想知道是否有一种方法可以使 html 字符串(绑定模板)吸引来自 javascript 函数的指令(或组件)。这是一个例子。

我有一些指令,我正在像这样测试它

function test($rootScope, $compile) {
    var scope = $rootScope.$new();
    var elem = $compile(angular.element(
        '<app-foo-bar attr1="val1" attr2="val2"></app-foo-bar>'
    ))(scope);
    scope.$apply();
}

声明一个元素字符串似乎有点笨拙,尤其是在有十几个属性的情况下。如果有一个函数可以像这样从对象生成 html 字符串。

genHtmlString('fooBar', {
    attr1: 'val1',
    attr2: 'val2'
});

输出当然是

<app-foo-bar attr1="val1" attr2="val2"></app-foo-bar>

这对我来说似乎是一个常见问题,但我找不到任何有助于编写此类函数的 angular、karma 或 jasmine 功能。

当然可以,该算法基本上是遍历对象属性并将其字符串化。

首先,您必须将元素的驼峰名称转换为虚线。你可以使用下面的函数来做到这一点(我从 this gist, shh 偷来的)。

function camelCaseToDash(myStr) {
  return myStr.replace( /([a-z])([A-Z])/g, '-' ).toLowerCase();
}

然后您可以遍历对象上的每个 属性 并渲染属性,最后将其组合在 html 标签中。

以下代码片段实现了一个简单的解决方案,错误处理非常差,而且只处理属性,您可能想要实现内部内容和东西。

function camelCaseToDash(myStr) {
  return myStr.replace( /([a-z])([A-Z])/g, '-' ).toLowerCase();
}

function genHtmlString(elmName, props) {

  props = props || {};

  var
    tagName = camelCaseToDash(elmName),
    htmlString = '<' + tagName;

  Object.keys(props).map(function(key) {
    htmlString += ' ' + (camelCaseToDash(key) + '="' + props[key] + '"');
  });

  return htmlString + '></' + tagName + '>';
}

var htmlString = genHtmlString('fooBar', {
  attr1: 'val1',
  attr2: 'val2',
  A: 'b',
  b: '',
  attrWithMultipleWords: 'HORAY!'
});

console.log(htmlString);