对于创建/编辑网站内容,我有一个带有一些标签的表单(用于创建标签系统的按钮,因为用户可能想要添加另一个"标签"等等)并且我使用了指示显示所选选项卡:
<form name="form" novalidate>
<div class="tabsContainer">
<!--some button making the idea of tabs system-->
</div>
<div class="contentDataContainer">
<content-form ng-model="VM.CurrentContent" page-features="VM.PageFeatures"></content-form>
</div>
</form>
当用户想要编辑内容时,我向Web服务请求内容数据:
loadData = function () {
var deferred = $q.defer();
ContentsService.GetContentToCreateEdit({ id: vm.IdContent })
.then(function(response)
{
try {
if (vm.IdContent <= 0 || (response.ResultOperation === ResultEnum.Success && exists(response.ResultObject.Contents)))
{
vm.Model = ContentVM.GetModelToShow(response.ResultObject.Contents);
vm.CurrentContent = vm.Model[0];
}
else
{
//some like with error messages
}
}
catch (err) { }
deferred.resolve();
}, function () {
deferred.resolve();
});
LoadingService.Load(deferred.promise, 'first');
};
指令的模型必须更新。
指令控制器:
vm.Model = { Id: 0 };
function init()
{
vm.Model = exists($scope.model) ? $scope.model : getDefaultContentInfo();
if(isStringEmpty(vm.Model.Price)) vm.Model.Price = "";
vm.Model.PriceText = vm.Model.Price;
vm.Model.IsIntervalDate = !isStringEmpty(vm.Model.EndDate) && vm.Model.EndDate != vm.Model.StartDate;
};
init();
$scope.$watch($scope.model, function () {
init();
}, true);
如果我在debugger
函数中添加了init()
,那么该指令会与$scope.model
完美匹配,但如果我还没有... {/} p>
有人可以解释这里发生了什么,我该如何解决?
我已尝试使用$scope.$apply()
,但我收到了摘要错误,并且我已尝试使用$timeout()
,但指令的模型并未更新。
$timeout(function () {
init();
$scope.$watch($scope.model, function () {
init();
}, true);
},500);
答案 0 :(得分:0)
进入初始化时,可能未设置vm.Model
。使用调试器,您需要等待足够的时间来设置变量
如果getDefaultContentInfo()
返回一个promise,那么你需要做的是将变量设置为promise中返回的then
函数中的数据。
答案 1 :(得分:0)
在实施表单验证后,我需要显示模型错误,然后再次出现问题。经过许多头痛并找到了问题后,最终结束了。
在我的$scope.$watch
$scope.$watch($scope.model, function () {
init();
}, true);
watchExpression 必须是幂等性的,所以我将代码更改为
$scope.$watch('model', function () {
init();
}, true);
现在有效!!!
有关更多文档click here