我偶尔会注意到 Umbraco 初始化我的数据类型 $scope.model.value
值的数据有奇怪的行为。
我正在使用 Umbraco 7.11.1,我的自定义数据类型是围绕一个复杂的基于 JSON 的数据模型构建的。
在“保存并发布”期间(来自 Umbraco 后台),Umbraco 似乎接受了我的 Controller 存储在 $scope.model.value
中的 JSON - 没有显示错误对话框,记录控制台错误等。
然而,当后台重新加载时,Umbraco 尝试使用部分的、格式错误的 JSON 字符串而不是预期的 JSON 对象(即之前保存的)来初始化我的数据类型。
我遵循通过 angularjs Controller 实现自定义数据类型的常规模式:
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 数据类型中的数据量是否有限制?还是我在这里忽略了其他东西?
此问题的解决方案是清理我的 Controller 存储在 $scope.model.value
中的 JSON 数据。
似乎 Umbraco 对 angularjs 放入范围变量(“$$hashKey”等)的额外元数据“东西”很敏感,这似乎是导致我的数据类型随后用格式错误的 JSON 字符串初始化的原因比预期的 JSON 对象。
最后,我选择:
- 克隆我的数据类型初始化的模型值(即
$scope.myModel
,如下所示)
- 设置一个
$watcher
以将 $model.scope.value
与对 $scope.myModel
所做的任何更改同步
- 在同步期间,在
$model.scope.value
中存储一个经过清理的 $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();
});
}])