Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在控制器内使用角度平移,用于服务带来的数据_Javascript_Angularjs_Json_Angular Translate_Angular Schema Form - Fatal编程技术网

Javascript 在控制器内使用角度平移,用于服务带来的数据

Javascript 在控制器内使用角度平移,用于服务带来的数据,javascript,angularjs,json,angular-translate,angular-schema-form,Javascript,Angularjs,Json,Angular Translate,Angular Schema Form,我有以下情况: 我有一个包含此类数据的JSON文件: "IOS_TABLET_DOWNLOAD_URL": { "type": "string", "minLength": "5", "title": "IOS_TABLET_DOWNLOAD_URL", "description": "$filter('translate')('configuration.IOS_TABLET_DOWNLOAD_URL')" }, 描述字段需要使用转换,我将服务注入我的控制器,如下所示 Con

我有以下情况:

我有一个包含此类数据的JSON文件:

"IOS_TABLET_DOWNLOAD_URL": {
  "type": "string",
  "minLength": "5",
  "title": "IOS_TABLET_DOWNLOAD_URL",
  "description": "$filter('translate')('configuration.IOS_TABLET_DOWNLOAD_URL')"
},
描述字段需要使用转换,我将服务注入我的控制器,如下所示

ConfigController.$inject = ['$scope', '$filter', '$compile', 'MyService'];
function ConfigController($scope, $filter, $compile, MyService) {

  // And using compile
  $scope.schema = elements; // Where element is the object from MyService
  $compile($scope.schema)($scope);

}
<div ng-controller="FormController">
   <form sf-schema="schema" sf-form="form" sf-model="model"></form>
</div>
但是,$filter未经处理就被打印为视图中的描述

“$filter('translate')('configuration.IOS\u TABLET\u DOWNLOAD\u URL')”

编辑

我正在使用生成表单。所以基本上我有这样的观点

ConfigController.$inject = ['$scope', '$filter', '$compile', 'MyService'];
function ConfigController($scope, $filter, $compile, MyService) {

  // And using compile
  $scope.schema = elements; // Where element is the object from MyService
  $compile($scope.schema)($scope);

}
<div ng-controller="FormController">
   <form sf-schema="schema" sf-form="form" sf-model="model"></form>
</div>


我该怎么做呢?

我刚刚意识到,
description
属性是一个字符串。我看不出它会打印其他任何东西。JSON并不是真正用来承载函数的,只是用来承载数据(否则它只是简单的JS)。只需传递要筛选的数据,并用最终结果替换它。

完整的工作小提琴在,它有点长,因此我将在这里分解相关部分

主要问题是
angular schema form
angular translate
都不知道如何处理
“description”:“$filter('translate')('configuration.IOS\u TABLET\u DOWNLOAD\u URL')”
。我们需要自己翻译

首先,我们的模式现在不再需要处理过滤器本身:

var schema = {
    "type": "object",
    "title": "Sample Schema",
    "properties": {
        "IOS_TABLET_DOWNLOAD_URL": {
          "type": "string",
          "minLength": "5",
          "title": "IOS_TABLET_DOWNLOAD_URL_TITLE",
          "description": "IOS_TABLET_DOWNLOAD_URL_DESCRIPTION"
        }
    }
};
标题
描述
字段现在可以直接引用翻译标记。接下来,我们将编写一个angular服务,它将检索这个模式,但已经进行了翻译。我想这就是您的
MyService
的意图:

.factory('Schema', function ($q, $translate) {
    return {
        elements: function() {
            var a = [];
            var result = angular.copy(schema);
            angular.forEach(result.properties, function (value, key) {
                a.push($translate([value.title, value.description]).then(
                    function (translations) {
                        value.title = translations[value.title];
                        value.description = translations[value.description];
                    }
                ));
            });
            return $q.all(a).then(function() { return result; });
        }
    }
})
让我们把它分解一下:

var a = [];
var result = angular.copy(schema);
首先,我们设置一个数组
a
,我们将在其中放入一组承诺(模式中的每个字段对应一个承诺),并复制原始模式,因为我们将对其进行修改

angular.forEach(result.properties, function (value, key) {
    a.push($translate([value.title, value.description]).then(
        function (translations) {
             value.title = translations[value.title];
             value.description = translations[value.description];
        }
    ));
});
这里我们迭代模式中的每个属性(仅此示例中的一个),请求对该属性的
title
description
字段进行翻译。由于
$translate
返回承诺,因此我们需要附加一个
。然后
处理程序,以便在承诺解决后将翻译直接应用到模式的副本中。最后,承诺也被附加到
a
数组中,该数组的任务是记住我们正在运行的所有承诺的列表

return $q.all(a).then(function() { return result; });
最后,我们等待所有这些承诺都得到解决(即,翻译都已完成),然后返回完全翻译的模式对象

.controller('FormController',function ($scope, Schema) {

    Schema.elements().then(function (elements) {
        $scope.schema = elements;
    })
    $scope.model = {};
    $scope.form = [
        "IOS_TABLET_DOWNLOAD_URL"
    ];

});
实际的控制器本身相当简单,与您原来的控制器没有太大区别。模板中的标记也不会更改

为了好玩,请尝试将首选语言从
en
更改为
de

$translateProvider.preferredLanguage('de');
编辑

如果要从其他文件或服务检索架构内容,请将
elements
方法替换为以下内容:

elements: function() {
    return $http.get('path/to/schema.json').then(function(response) {
        var a = [];
        var schema = response.data;
        angular.forEach(schema.properties, function (value, key) {
            a.push($translate([value.title, value.description]).then(
                function (translations) {
                    value.title = translations[value.title];
                    value.description = translations[value.description];
                }
            ));
        });
        return $q.all(a).then(function() { return schema; });
    });
}

你的观点是什么?我们只能猜测,直到你告诉我们question@DannyG您仍然有解决方案吗?@nicknystrom是的,bounty正在启用,因为这是通过ajax获取的模式JSON?或者它只是静态javascript中的一个结构?您的确切意思是什么?在
IOS\u TABLET\u DOWNLOAD\u URL
中,属性
description
用引号括起来;除非要使用
eval()
(不要这样做),否则JSON无法传输可用函数。我建议不要包含要进行的函数调用的文本字符串,而是传输关键字,您可以在流程图中分离这些关键字,或者对其执行一些预定的操作。我也考虑过eval函数,但根本不想使用它。但是你是对的,我必须想一个合适的解决方案。你知道吗,
描述
可能需要通过翻译过滤器,或者可能的内容类型非常多样化?至少,您是否可以控制首先提供它的资源?我必须尝试未知的方法,其想法是一个集成团队(某种后端,修改模式和表单,他们还可以使用i18n键修改json文件,因此它可以是N个未知数量keys@DannyG:此解决方案对您有帮助吗?我在atm上工作,而这不是一个工作项目,我会尝试然后向您提供反馈我正在使用一个外部.json文件,如何在这个工厂c你从外部文件读取了吗?这就是为什么我得到了一个服务,我忘了提到用一个修改过的版本替换
元素
函数,该版本使用
$http.get
检索架构内容。所以,我只是去掉了.service.js文件,只使用工厂?