我有以下解析JSON文件的函数:
myApp.controller('myCtrl1', function($scope, $http, $compile, $interpolate, $templateCache) {
$http.get('JSONFile1.json').success(function(data) {
for (var i in data) {
var interpolated = $interpolate($templateCache.get("Tpl1").trim())(data[i]);
angular.element(document.querySelector("#loadTpl1")).append($compile(interpolated)($scope));
}
});
});
但我有几个JSON文件需要单独解析。如果我想解析这个文件,我会为每个文件再次写一个类似的函数,如:
myApp.controller('myCtrl2', function($scope, $http, $compile, $interpolate, $templateCache) {
$http.get('JSONFile2.json').success(function(data) {
for (var i in data) {
var interpolated = $interpolate($templateCache.get("Tpl2").trim())(data[i]);
angular.element(document.querySelector("#loadTpl2")).append($compile(interpolated)($scope));
}
});
});
所以功能进一步成倍增加。所有功能都相同但ID不同。
如何在函数中放置所有这些相同的函数,以便我可以解析函数中的每个JSON文件并编写更少的代码?
编辑:
json文件的内容(示例):
[
{
"_comment": "Launch Camera Button",
"type": "button",
"id": "cameraBt",
"icon": "ion-android-camera",
"name": "Launch Cam",
"toPage": "",
"color": "white",
"function": "takePicture()",
"controller": "CameraCtrl",
"backgroundcolor": "#0066FF",
"font-size": "20px"
}
]
从html调用函数:
<div ng-controller="myCtrl1" id="loadTpl1">
<script type="text/ng-template" id="Tpl1">
<a style="color:{{color}}; background-color:{{backgroundcolor}};" id="{{id}}" class="{{type}}" href="{{toPage}}" ng-controller="{{controller}}" ng-click="{{function}}">
<i id="{{iconid}}" class="{{icon}}">{{texticon}}{{linebreak}}</i>
<br>{{name}}
</a>
</script>
</div>
可以看出,我可以在页面中添加HTML组件或从JSON文件中删除它们。这就是上述功能所做的一切。
答案 0 :(得分:0)
最好创建一个指令,它会调用您的自定义JSON服务:
myApp.factory('jsonGetter',['http', function( $http ) {
return function( $id ) {
return $http.get('JSONFile' + $id + '.json');
}
}]);
myApp.directive('jsonData',['$scope', '$compile', '$interpolate', '$templateCache','jsonGetter', function() {
return {
scope: {
id: '='
},
tempalteUrl:'jsonTemplate.html',
link: function( scope, $elm ) {
jsonGetter( scope.id ).then(function( data ) {
// I assume that data is an array where
// there is an object you specified in your answer
angular.extend( scope, data[0] );
});
}
};
}]);
在jsonTemplate.html
:
<a ng-style="{ 'color' : color,'background-color': backgroundcolor }" id="{{id}}" class="{{type}}" href="{{toPage}}" ng-controller="{{controller}}" ng-click="{{function}}">
<i id="{{iconid}}" class="{{icon}}">{{texticon}}{{linebreak}}</i>
<br>{{name}}
</a>
当我们调用如下指令时,它使用服务根据id获取数据,然后使用服务器数据扩展模板的范围:
<json-data id="1"></json-data>