JSON-Objects with AngularJS 和 Ionic 在 ng-controller 中的表达式

Expression in ng-controller for a JSON-Objects with AngularJS and Ionic

我解析 JSON 个对象来创建 html 个元素。就我而言,我从 json 文件 Buttons:

创建
{
    "type": "button",
    "id": "comButton",
    "icon": "ion-chatboxes",
    "name": "Communication",
    "onclick": "",
    "controller": "somemthctrl",
    "ngclick": "launchSomemethod()",
    "color": "white",
    "backgroundcolor": "#ff5db1",
    "font-size": "20px"
}

控制器:

myApp.controller('generateButtonCtrl', function ($scope, $http) {
    $http.get('JSON/buttons.json').success(function(data){
        $scope.components = data;
    });
});

在 HTML 页面中,我调用了 json 文件中的组件:

<a ng-repeat="component in components"
   style="color:{{component.color}}; background-color:{{component.backgroundcolor}} "
   id="{{component.id}}"
   class="{{component.type}}"
   href="{{component.onclick}}"
   ng-click="{{component.ngclick}}"
   ng-controller="{{component.controller}}">

    <i class="{{component.icon}}"><br></i>
    {{component.name}}
</a>

ng-click="{{component.ngclick}}"ng-controller="{{component.controller}}" 的情况下将不包括在内。

在适当的地方,我从我的编辑器 WebStorm 得到以下错误:标识符或字符串文字或数字文字预期。

我有一个 {{expression}} 问题。如何将 ng-controllerng-click 集成为来自 json 对象的字符串?

我不确定 ng-controller 是否可能是 {{ expression }}。 解决方法是创建一个函数,该函数 returns 您想要的控制器的名称,您可以将其分配给控制器内的 var...

在其他情况下,为什么要为每个按钮使用不同的控制器?

这很棘手。 Angular 团队在他们的文档中建议在解析 DOM 时将控制器注册到模块。

All the $scope properties will be available to the template at the point in the DOM where the Controller is registered.

Link: Angular controllers


  • 使用$controllerProvider注册控制器这个link 阐明了稍后如何解决控制器的问题 时间,这可能会帮助您根据需要设计代码。
  • ng-click 你可以在 $scope 树的控制器中给出一个表达式或方法。这两个表达式 and/or 函数 搜索发生在 $scope 树中 模板。

根据提琴手的要求更新


我已经更正了 fiddler 代码,删除了不需要的行和错误并使其正常工作。

现在您的模板在 运行 时动态绑定到 JavaScript 代码。

Fiddler Link

Javascript:

 var myApp = angular.module('starter', []);
myApp.config(['$sceDelegateProvider', function($sceDelegateProvider) {
    $sceDelegateProvider.resourceUrlWhitelist([
        'self',
        'https://api.myjson.com/**'
    ]);
}]);

myApp.controller('generateHTMLCtrl', function ($scope, $http, $compile, $interpolate, $templateCache) {
    $http.get('https://api.myjson.com/bins/1gkh0').success(function (data) {      
        for(var i in data){
            var interpolated = $interpolate($templateCache.get("tpl").trim())(data[i]);            
            angular.element(document.querySelector("#loadhere")).append($compile(interpolated)($scope));            
        }               
    });
});

myApp.controller("OpenLinkCtrl", function ($scope) {    
        $scope.OpenLink = function () {
           alert("Link open");
        }    
});

Html:

 <body ng-app="starter" class="padding" style="text-align: center">
 <div class="row responsive-md" ng-controller="generateHTMLCtrl" id="loadhere"></div>                                        
 <script type="text/ng-template" id="tpl">
                 <div class="col">
                    <a style="color:{{color}}; background-color:{{backgroundcolor}} "
                       id="{{id}}" class="{{type}}" href="{{topage}}" ng-controller="{{controller}}" ng-click="{{function}}"><i class="{{icon}}"><br></i>{{name}}</a>
                </div>
          </script>
    </body>

解释:

  • 使用插值服务
  • 使用编译器服务

注意:插值器无法解析对象数组。因此用于循环来插入每个对象数组并将其附加到 DOM.

可以找到有关编译器和插值的更多信息here