在自定义 Umbraco 数据类型中加载 $scope.model.value 时格式错误 JSON

Malformed JSON when loading $scope.model.value in custom Umbraco data type

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

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

在 "Save and Publish" 期间(来自 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 模型中有大量数据(即 json 将序列化为 ~150 个或更多字符)时,似乎会出现此问题

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

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

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

最后,我选择了:

  1. 克隆我的数据类型用
  2. 初始化的模型值(即 $scope.myModel,如下所示)
  3. 设置 $watcher 以将 $model.scope.value 与对 $scope.myModel
  4. 所做的任何更改同步
  5. 在同步期间,在 $model.scope.value
  6. 中存储 $scope.myModel 的经过清理的克隆(即排除内部 angular 元数据,如“$$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();
    });
}])