【问题标题】:Not getting updated values after call to AngularJS $save调用 AngularJS $save 后没有得到更新的值
【发布时间】:2013-06-03 23:05:57
【问题描述】:

各位, 我正在使用 AngularJS 和 angular-resource 来执行一个非常简单的 REST API 调用。这是我列出(并创建)消息的页面的 JavaScript 代码:

(function() {
'use strict';
var messagesApp = angular.module('messagesApp', ['ngResource']);

messagesApp.factory('Message', function($resource) {
    return $resource('/api/messages/:id', {id: '@id'}, {
        query: {method:'GET', isArray:true} });
});

messagesApp.controller('MessagesCtrl',
  function($scope, Message) {
    $scope.messages = Message.query();

    $scope.addMessage = function() {
        $.Dialog({
            'title': 'Add new Message',
            'content': '<p>Enter the <strong>unique</strong> name of the new message.</p><input type="text" id="newMessageName"/><p>Enter the <strong>unique</strong> ID for this message.</p><input type="text" id="newID"/>',
            'draggable': false,
            'overlay': true,
            'closeButton': true,
            'buttonsAlign': 'right',
            'buttons': {
                'save': {
                    'action' : function() {
                        var newMessage = new Message();
                        newMessage.name = $('#newMessageName').val()
                        newMessage.altid= parseInt($('#newID').val())
                        newMessage.longDescription = "This is a new message";
                        newMessage.$save();
                        console.log(newMessage.id)
                    }
                }
            }
        });
    }
  }
);
})();

控制台日志消息会打印出“未定义”。当我查看网络日志时,我发现我的 REST API 确实在返回新创建的对象时返回了它。我不应该使用 Ok 作为结果类型,而是使用其他东西吗?是否有我缺少的 HTTP 标头.. 还是我使用 $save 错误??

$.Dialog() 方法来自我正在使用的另一个 JavaScript 库 (metroui.og.ua),我不知道这是否会干扰这个。

【问题讨论】:

  • 我不知道从原始帖子中是否清楚,但是为保存我的资源进行了实际的网络调用,并且来自 POST 的响应正文实际上是包含新创建的 JSON对象,设置了 id 属性。
  • 您的用例可能非常简单,这可能有点矫枉过正,但您可以考虑在控制器中替换 $.Dialog 调用。看看 AngularJS Bootstrap - 他们有一个非常有效的 Dialog 指令。它允许您将 HTML 从控制器中提取出来,并稍微简化一下。 angular-ui.github.io/bootstrap/#/dialog

标签: javascript rest angularjs angular-resource


【解决方案1】:

newMessage.$save() 是异步的,所以如果你想获取响应数据,你应该在成功回调函数中进行:

newMessage.$save(function(msg, headers){
  console.log(newMessage.id); // note, at this point msg === newMessage
});

the docs

【讨论】:

  • 这成功了。出于某种原因,我在 $resource 的文档中看到的示例没有突出为异步,我错过了。
  • 实际上,您链接到的 ngResource 文档并不存在。这只是几个cmets。我发现很难找到任何好的 $resource 实例。
  • 我已经修复了链接,那里有一些例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2011-02-24
相关资源
最近更新 更多