如何预处理AngularJS Schema Form的模型值

时间:2015-04-06 21:13:54

标签: angular-schema-form

我正在使用Angular Schema Form模块创建一些动态表单。该模块非常有用且直截了当,但我是Angular的新手,对于预处理一些json数据有疑问。

场景:我们有一些现有的json,我们想要提供给我们的json架构表单应用程序。大多数字段都运行良好,但对于布尔值,我们的积分器使用字符串值“true”和“false”,当Angular Schema Form不识别为实际值 true false 时解析(可以理解)。

示例,我们在架构中有这个:

{
    ....
    "isRequred":{
      "type":"boolean",
      "title":"Required"
    }
    ....
}

对于我们的实际数据,我们有:

{
   ...
   "isRequired":"true"
   ...
}

我已通过更改复选框模板并向其添加指令,然后通过指令执行转换逻辑来更正此问题。相关代码:

angular.module('jsonFormBuilderApp').directive('stringToBoolean', function($parse){
   return {
     require: 'ngModel',
     link: function(scope, element, attrs, modelCtrl) {

       var value = scope.$eval(attrs.ngModel);
       var boolvalue = (value === true || value === 'true');
       modelCtrl.$setViewValue(boolvalue);
       modelCtrl.$render();

     }
   };
});

angular.module('schemaForm').run(['$templateCache', function($templateCache) {
  $templateCache.put("directives/decorators/bootstrap/checkbox.html","<div ... copy the template from bootstrap decorators and add string-to-boolean to the input field ...> </div>");
}]);

这有效,但我不得不怀疑这是否是正确的方法来完成这项任务,或者是否有更好的,更推荐的方式? 另一个问题是我正在更改使用checkbox.html的所有表单/模式类型的所有模板,因为我不认为使用此方法我可以检查模式实际上是一个类型“boolean” ,我怀疑可能会产生问题......

按照约瑟夫的建议,创建一个指令并处理这些异常,可以更清晰地提供关注点分离。

然而,为了进一步提炼这个问题,我想我最终要问的是:什么是插入模型值适合模式的过程的最佳方法?

感谢您浏览一下,欢迎提出任何建议。

2 个答案:

答案 0 :(得分:1)

也许这是对不同问题的回答,但您的问题也可以通过使用架构解决,其中isRequired "type": "string""enum": ["true", "false"]

对于表单,您可以使用"type": "radiobuttons""titleMap": ["Required", "Not required"]来选择"true" / "false",或者编写自己的自定义表单类型添加 - 获得一个复选框。

答案 1 :(得分:0)

在对Angular更熟悉之后,我发现指令可以链接多次。我的最终解决方案是:不是将全新模板映射到表单项,而是检查所有ngModel项以查看它们是否为布尔值,如果是,则我过滤它们的值以转换字符串&#34; true&#34; to boolean true,如下所示:

angular.module('schemaForm')
 .directive('ngModel', function() {
   return {
     priority: 1001,
     link: function(scope, element, attrs) {

       if(typeof(scope.form) !== 'undefined' && scope.form.schema.type === 'boolean') {
         scope.$watch(attrs.ngModel,function() {
           var value = scope.$eval(attrs.ngModel);
           var boolvalue = (value === true || value === 'true' || value === '1');
           scope.ngModel.$setViewValue(boolvalue);
           scope.ngModel.$render();
         });
       }

     }
   };
});

我确信这可以进一步优化。如果对此有任何想法或对更好方法的建议,请分享。