1

我正在尝试在我的 Angular 应用程序中创建一个 Showdown 扩展,它将显示范围变量。我能够很容易地设置它来显示基本范围变量,但现在我想把它放到可以使用结果的地方,除了显示ng-repeat之外我什么也得不到[[object HTMLUListElement]]

到目前为止,这是我的控制器:

app.controller('MyCtrl', ['$scope', '$window', '$compile', function($scope, $window, $compile){
    $scope.machines = [
        { abbv: 'DNS', name: 'Did Not Supply' },
        { abbv: 'TDK', name: 'The Dark Knight' },
        { abbv: 'NGG', name: 'No Good Gofers'}
    ];
    $scope.machine = $scope.machines[0];

    $scope.machine_list = $compile('<ul><li ng-repeat="m in machines">{{m.abbv}}: {{m.name}}</li></ul>')($scope);
  $scope.md = "{{ machine_list }}";

    var scopevars = function(converter) {
        return [
            { type: 'lang', regex: '{{(.+?)}}', replace: function(match, scope_var){
                scope_var = scope_var.trim();

                return $scope.$eval(scope_var);
            }}
        ];
    };
    // Client-side export
    $window.Showdown.extensions.scopevars = scopevars;
}]);

Plunkr:到目前为止的代码

我觉得我必须接近,但现在我不知道我是否在完全错误的轨道上,或者它是否是摊牌的事情或角度的事情或什么。

4

1 回答 1

0

我意识到我正在用我这样做的方式与 Angular 作斗争(并且严重失去了安静)。控制器中的 DOM 是禁忌。现在我有点生气,一旦我开始正确思考并查看指令,它是多么容易。

现在,我没有尝试在控制器中进行编译和所有操作,而是将$compile服务包含在我正在使用的指令中,因此:

htmlText = converter.makeHtml(val);
element.html(htmlText);

变成:

htmlText = converter.makeHtml(val);
element.html(htmlText);
$compile(element.contents())(scope);

有了这个更改,我不再需要刚刚进行基本评估的扩展部分,因为它正在编译{{ machine.name }}是自动转换的。

但这仍然让我无法指定一个变量来插入模板,只能指定变量。但是现在输出将通过 angular 编译,我可以将模板放在一个部分中并使用扩展从一个模式转换为一个ng-include有效的模式。

新控制器代码:

app.controller('MyCtrl', ['$scope', '$window', '$compile', function($scope, $window, $compile){
    $scope.machines = [
        { abbv: 'DNS', name: 'Did Not Supply' },
        { abbv: 'TDK', name: 'The Dark Knight' },
        { abbv: 'NGG', name: 'No Good Gofers'},
        { abbv: 'TotAN', name:'Tales of the Arabian Nights'}
    ];
    $scope.machine = $scope.machines[0];

  $scope.tpls = {
    'machinelist': 'partials/ml.html'
  };
  $scope.md = "{{machines.length}}\n\n{{include machinelist}}";

    var scopevars = function(converter) {
        return [
          { type: 'lang', regex: '{{include(.+?)}}', replace: function(match, val){
            val = val.trim();
            if($scope.tpls[val] !== undefined){
              return '<ng-include src="\''+$scope.tpls[val]+'\'"></ng-include>';
            } else {
              return '<pre class="no-tpl">no tpl named '+val+'</pre>';
            }
          }}
        ];
    };
    // Client-side export
    $window.Showdown.extensions.scopevars = scopevars;
}]);

当然还有新的 plunkr

希望这可以帮助以后的人

古人的智慧

于 2015-02-21T05:46:54.577 回答