我在jqGrid中定义了一个beforeSubmit
方法,如下所示:(请注意我使用AngularJS,它提供$http
服务来获取和发布数据)
beforeSumit: function(data) {
// I need this to be filled with default data atomatically
if(data.someField == "") {
$http.get('defaultValue/' + data.id).success(function(getData) {
// I put the default value into the data model returned to server
data.someField = getData;
// return sentence, jqGrid should continue saving without message
return [true, null];
}).error(function() {
// return sentence, jqGrid should keep the edit form, showing a message
return [false, "Couldn't get data from server"];
});
} else {
// return sentence, jqGrid should continue saving without message
return [true, null];
}
}
我正在做的是检查someField
是否为空,如果它为空,我会从服务器获取默认值。
问题是return
语句在undefined method
成功/错误中使用时会抛出$http.get
错误。
在那里返回一个值是否可行?我需要通知jqGrid它是否应该继续保存数据的过程......
编辑:感谢@Oleg和@Sacho评论我已经意识到我无法在beforeSubmit
内使用异步函数,所以最后我放了{{ 1}}调用jqGrid的$http
事件。
现在我需要询问用户onselectrow
编辑表单,是否要设置默认值或想要返回编辑表单并为该字段编写自定义值。
我可以使用beforeSubmit
AngularJS的服务使用模式进行操作,但我担心它也是异步的,所以我遇到了比以前更多的问题。
有没有办法同步打开模态?如果浏览器出现问题并不重要,因为在用户决定之前,该过程不会继续。
这是现在的代码:
$modal
模态是一个带有一些测试的窗口,包括beforeSubmit: function(data) {
// I get this value in the onselectrow event
var defaultValue = $scope.defaultalue;
var modalInstance = $modal.open({
templateUrl: 'app/partials/selectOptionDialog.html',
controller: 'SelectOptionDialogCtrl',
windowTemplateUrl: 'app/partials/modalTemplate.html',
size: 'sm',
resolve: {
defaultValue: function() {
return $scope.defaultValue;
}
}
}).result.then(function(resolution) {
if (resolution == true) {
// user wants to put default value
data.someField = defaultValue;
// jqGrid should continue
return [true, null];
} else {
// jqGrid should go back to edit form with error message
return [false, "Please, fill the 'Archive Folder Name' field"];
}
});
}
和两个按钮,一个用值defaultValue
(保存)关闭模态,另一个用值true
关闭模态(回去)。
解决方案:毕竟,按照我想要的方式做我想做的事情是不可能的。
最后,当用户使用jqGrid事件false
单击一行时,我会获得默认值。
我已经用自定义编辑按钮替换了jqGrid的编辑按钮。我的编辑按钮的作用是检查该行是否包含我要检查为空的字段。如果是,则显示询问用户的对话框,并且当用户选择选项时,显示编辑表单(如果用户选择了#34;设置默认值"如果选择了#34,则填写字段;#34;另一个值&#34 ;.
我已经更改了colModel以强制填写字段,因此如果用户选择"另一个值"在对话框中,然后填写该字段,jqGrid中将显示错误。
答案 0 :(得分:2)
很明显,您无法使用异步调用beforeSubmit
回调内的服务器。您可以使用同步 Ajax调用来修复代码,例如使用带有async:false
参数的jQuery.ajax,但使用同步调用将阻止你的页面一段时间。最好在最初加载网格时主网格数据中包含defaultValue
。
作为替代方案,您可以在beforeInitData
内部进行异步调用(它将被称为buring open of the form)。您可以将结果保存在某处,稍后在beforeSubmit
内使用。
更新:如果您已经从服务器加载了默认值(或默认值),那么您可以实现以下方案:
beforeSubmit
发现问题,则可以将空字段更改为默认值(编辑表单的字段具有相同列的id
属性的name
值)和使用户可以看到更改。例如,可以使用jQuery效果(突出显示效果或许多其他效果)或jQuery UI effect(Highlight,Color Animation)。例如,可以使用toggleClass和“ui-state-error”类。如果至少有一个字段被修改为默认值,则beforeSubmit
应返回错误。beforeSubmit
电话会议(用户在上述修改后点击“提交”)之后,它可以返回[true]
并允许将数据发布到服务器。答案 1 :(得分:1)
如果jqGrid支持返回promise的beforeSubmit
(也就是说,异步beforeSubmit
),那么@Pam是正确的。如果不是,正如@Sacho所说,那么当执行beforeSubmit
时,您需要承诺已经解决。确保这一点的唯一方法是在promise的回调中写入beforeSubmit
。
$http.get('defaultValue/' + data.id).success(function (defaultValue) {
/* all the code dependending on this defaultValue variable should go here */
...
beforeSubmit: function (data) {
if (data.someField == "") {
data.someField = defaultValue;
return [true, null]
} else {
...
}
},
...
})
.error(function () { /* handle network or server-side error */ }
答案 2 :(得分:0)
由于返回了$ http承诺,我认为您需要将$http.get(..)
更改为return $http.get(..)
。
另请注意,
使用.success()
将返回原始承诺,.then()
将返回新承诺。
由于每次调用都会返回一个新的承诺,.then()
将驱动顺序操作。