在promise中返回一个值

时间:2014-08-20 08:54:27

标签: angularjs jqgrid

我在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中将显示错误。

3 个答案:

答案 0 :(得分:2)

很明显,您无法使用异步调用beforeSubmit回调内的服务器。您可以使用同步 Ajax调用来修复代码,例如使用带有async:false参数的jQuery.ajax,但使用同步调用将阻止你的页面一段时间。最好在最初加载网格时主网格数据中包含defaultValue

作为替代方案,您可以在beforeInitData内部进行异步调用(它将被称为buring open of the form)。您可以将结果保存在某处,稍后在beforeSubmit内使用。

更新:如果您已经从服务器加载了默认值(或默认值),那么您可以实现以下方案:

  • 如果beforeSubmit发现问题,则可以将空字段更改为默认值(编辑表单的字段具有相同列的id属性的name值)和使用户可以看到更改。例如,可以使用jQuery效果(突出显示效果或许多其他效果)或jQuery UI effectHighlightColor 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()将驱动顺序操作。