2013-05-08 65 views
2

结合我有具有两个区段AngularJS:例如双向数据与资源

一个)视图事务
b)中添加的事务

被绑定到视图事务。以下控制器

function TransactionController($scope, Category, Transaction) { 
    $scope.categories = Category.query(function() { 
    console.log('all categories - ', $scope.categories.length); 
    }); 

    $scope.transactions = Transaction.query(); 

    $scope.save = function() { 
    var transaction = new Transaction(); 
    transaction.name = $scope.transaction['name']; 
    transaction.debit = $scope.transaction['debit']; 
    transaction.date = $scope.transaction['date']; 
    transaction.amount = $scope.transaction['amount']; 
    transaction.category = $scope.transaction['category'].uuid; 

    //noinspection JSUnresolvedFunction 
    transaction.$save(); 
    $scope.transactions.push(transaction); 
    console.log('transaction saved successfully', transaction); 

    } 
} 

,其中事务是一个服务,看起来如下

angular.module('transactionServices', ['ngResource']).factory('Transaction', function($resource) { 
    return $resource('/users/:userId/transactions/:transactionId', { 
     // todo: default user for now, change it 
     userId: 'bd675d42-aa9b-11e2-9d27-b88d1205c810', 
     transactionId: '@uuid' 
    }); 
    }); 

当我在选项卡“交易”点击,路由#/交易被激活,导致它呈现两个子视图)和b)

的问题,我是,
- 。有每次添加新事务时更新$ scope.transactions的方法?由于它是一个资源
或我将不得不手动做$ scope.transactions.push(交易);

回答

2

无法自动更新范围中的一组模型。您可以将其推送到$ scope.transactions中,或者您可以调用一个方法,使用来自服务器的新数据更新$ scope.transactions。在任何情况下,你应该更新你的资源的成功回调$范围保存这样的功能:

transaction.$save({}, function() { 
    $scope.transactions.push(transaction); 
    //or 
    $scope.transactions = Transaction.query(); 
}); 

在您的例子,当你推的交易,你不能肯定,该模型已成功保存然而。

另一个秘诀:

$scope.newTransaction = new Transaction(); 

$scope.addTransaction = function() { 
    $scope.newTransaction.save(... 
} 
在你看来

而且地方:

<input type="text" ng-model="newTransaction.name" /> 

的NG-您可以在保存之前直接从您的视图中创建新的事务,并更新模型model指令确保输入绑定到newTransaction模型的name属性。

3

我的第一个答案,从而把它容易对我...

您可以扩展事务资源更新$ scope.transactions你。这将是这样的:

angular.module(..., function($resource) { 
    var custom_resource = $resource('/users/:userId/transactions/:transactionId', { 
     ... 
    }); 

    custom_resource.prototype.save_and_update = function (transactions) { 
     var self = this; 
     this.$save(function() { 
      transactions.push(self); 
     }); 
    }; 

    return custom_resource; 
}); 

在你控制,你会然后做:

function TransactionController (...) { 
    ... 
    $scope.save = function() { 
     ... 
     // In place of: transaction.$save(), do: 
     transaction.save_and_update($scope.transactions); 
     ... 
    } 

} 

注意:你需要确保你创建的对象是在$范围完全可用。我花了30分钟试图找出为什么这个方法在我的代码上失败了,结果我在数据库中生成了身份代码。结果,我后来添加新对象的所有操作都失败了,因为新对象丢失了身份!