【问题标题】:Malformed JSON when loading $scope.model.value in custom Umbraco data type [duplicate]在自定义 Umbraco 数据类型中加载 $scope.model.value 时出现格式错误的 JSON [重复]
【发布时间】:2018-08-04 11:16:39
【问题描述】:

我偶尔会注意到 Umbraco 初始化我的数据类型 $scope.model.value 值的数据中有奇怪的行为。

我正在使用 Umbraco 7.11.1,我的自定义数据类型是围绕基于 JSON 的复杂数据模型构建的。

在“保存和发布”期间(来自 Umbraco 后台),Umbraco 似乎接受了我的控制器存储在 $scope.model.value 中的 JSON - 不显示错误对话框,记录控制台错误等。

然而,当后台重新加载时,Umbraco 会尝试使用部分格式错误的 JSON 字符串来初始化我的数据类型,而不是预期的 JSON 对象(即之前保存的)。

我遵循通过 angularjs 控制器实现自定义数据类型的常规模式:

angular.module('umbraco')
.controller('MyDataType', ['$scope', function ($scope) {

    var loadedData = $scope.model.value;

    // Do stuff with "loadedData"

    $scope.model.value = loadedData;
}])

当我的 JSON 模型中有大量数据(即序列化为 ~150 个字符或更多的 json)时,似乎会出现此问题

我可以存储在 Umbraco 数据类型中的数据量是否有限制?还是我在这里忽略了其他东西?

【问题讨论】:

  • AngularJS 进入范围变量(“$$hashKey”等)。如果你使用 angular.toJson(obj) 而不是 JSON.stringify(obj) 那么 Angular 会为你去掉这些内部使用的值。

标签: javascript angularjs json umbraco7


【解决方案1】:

解决这个问题的方法是清理我的控制器存储在$scope.model.value 中的 JSON 数据。

似乎 Umbraco 对 angularjs 放入范围变量(“$$hashKey”等)的额外元数据“东西”很敏感,这似乎是导致我的数据类型随后用格式错误的 JSON 字符串初始化的原因,而不是比预期的 JSON 对象。

最后,我选择了:

  1. 克隆我的数据类型初始化时使用的模型值(即$scope.myModel,如下所示)
  2. 设置$watcher 以同步$model.scope.value 与对$scope.myModel 所做的任何更改
  3. 在同步期间,在$model.scope.value 中存储$scope.myModel 的净化克隆(即不包括内部角度元数据,如“$$hashKey”)

示例伪代码演示解决方案:

angular.module('umbraco')
.controller('MyDataType', ['$scope', function ($scope) {

    $scope.myModel = cloneValue($scope.model.value)

    var endWatcher = $scope.$watch('myModel', function() { 

        $scope.model.value = cloneAndSanitizeMyModel($scope.myModel)
    });

    $scope.$on('$destroy', function() {
        endWatcher();
    });
}])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    相关资源
    最近更新 更多