角度数据绑定不更新正确的模型范围

时间:2015-08-17 14:04:24

标签: javascript angularjs parse-platform

在范围对象 userNotify 上有一些继承问题(希望如此)。

AccountCtrl处理用户帐户数据查看和更新​​,数据来自Parse.com数据库,通过 UserService 服务。

.controller('AccountCtrl', [
    '$state', '$scope', 'UserService',
    function ($state, $scope, UserService) {

        UserService.currentUser().then(function (_user) {
            $scope.user = _user;
            notification = _user.get('days');
            $scope.userNotify = {days: notification};
        });

        $scope.updateUser = function (_user) {
            days = $scope.userNotify.days;
            // days is logged with the correct value (if the user changed)
            // but the db record is updated with the initial value not the new one.
            // tested this by changing days to a random number.
            console.log(days);
            _user.set('days', days);
            _user.save();
        }

}])

数据显示在视图中, updateUser 函数应更新Parse db中的用户数据。

  <div ng-controller="AccountCtrl">
        <select ng-model="$parent.userNotify.days">
            <option>1</option>
            <option>2</option>
            <option>3</option>
        </select>
        <a ng-click="updateUser($parent.user)">Save</a>
  </div>

updateUser 函数中调用 _user.set 时, $ scope.userNotify.days 具有db中的旧值,因此更新具有相同的值,而不是用户选择的新值。 即使 console.log(days)显示正确的新值。

还尝试删除 $ parent 并使用基本类型。

这是UserService,它返回一个Promise:

    .service('UserService', ['$q', 'ParseConfiguration',
        function ($q, ParseConfiguration) {

            return {
                /**
                 * @param _parseInitUser
                 * @returns {Promise}
                 */
                currentUser: function (_parseInitUser) {

                    _parseInitUser = Parse.User.current();

                    if (!_parseInitUser) {
                        return $q.reject({error: "noUser"});
                    } else {
                        return $q.when(_parseInitUser);
                    }
                }
            }
        }]);

非常感谢

2 个答案:

答案 0 :(得分:0)

尝试将其作为html中的代码段

<body ng-controller="MainCtrl as main">
  <ion-view>
    <label class="item item-input item-select">
      {{currentSelection.value}}
      <select ng-model="currentSelection" ng-options="day as day.value for day in days track by day.value" style="width: 30px">
      </select>
    </label>
    <a class="button" ng-click="updateUser($parent.user)">Save</a>
  </ion-view>
</body>

这是javascript代码

angular.module('app', ['ionic'])
  .controller('MainCtrl', ['$scope', function($scope) {

    $scope.currentSelection = {};
    $scope.currentSelection.value = 1;

    $scope.days = [
      { value: 1 }, 
      { value: 2 }, 
      { value: 3 }
    ];
    $scope.updateUser = function() {
      days = $scope.currentSelection;
      alert(JSON.stringify(days));
    }
  }]);

不确定为什么要弄乱$parent以获取对用户的访问权限?只有一个当前用户,Parse提供了一个功能,可以让您在整个应用程序中访问它。

$scope.updateUser = function() {
  UserService.currentUser().then(function (_user) {
    return _user.save({days:daysValue});
  }).then(function(_updatedUser){
    console.log(_updatedUser);
  }, function(_error) {
    console.log(_error);
  });
};

答案 1 :(得分:0)

我通过将视图中的日期传递到updateUser函数来实现它。

在视图中:

<a ng-click="updateUser(user,userNotify.days)">Save</a>

在控制器中:

$scope.updateUser = function (_user,days) { console.log(days); }