【问题标题】:Access Backbone model in sync callback在同步回调中​​访问主干模型
【发布时间】:2013-02-22 04:43:25
【问题描述】:

我将_model 传递给我的ProcessModel 函数,然后在我的ProcessModel 函数中,它会将模型保存到服务器,从而触发sync 事件。我想做的是在我的sync 回调访问_model 中,因为CartView 正在侦听来自我的_model 的添加或更改事件。我说的有道理吗?

var _cartItem  = this.ConvertToSaleItem(item);
_cartItem.on('sync', this.TaxChangeSaveSuccess,  this);
_cartItem.on('error', this.TaxChangeSaveError, this);

_cartItem.url = Global.ServiceUrl + Service.SOP + Method.SALEITEMTAX;
_cartItem.save();

我的回调:

TaxChangeSaveSuccess : function(model, response, options) {
    if(!Global.isBrowserMode) window.plugins.cbNetworkActivity.HideIndicator();
        item.set({
            SalesTaxAmountRate : model.get("SalesTaxAmountRate")
        }); 
    },

但项目未定义。关于如何做的任何想法?我的视图需要相同的模型来捕获从我的模型(即项目)触发的任何事件。

【问题讨论】:

  • item 变量在更高的范围内可用吗?
  • 不。我尝试让 item 变量在更高的范围内可用,但它仍然不会触发我的视图正在监听的任何事件。
  • this.TaxChangeSaveSuccess 是你视图中的这段代码,因为这可以做到initialize:function(){ this.model.on("sync",callback,context); }

标签: backbone.js


【解决方案1】:

立即想到两个选项:

  1. item 存储为this 上的属性。
  2. 使用匿名函数包装器手动完成。

第一个看起来像这样:

this.item = item;
_cartItem.on('sync', this.TaxChangeSaveSuccess,  this);

//...

TaxChangeSaveSuccess : function(model, response, options) {
    if(!Global.isBrowserMode) window.plugins.cbNetworkActivity.HideIndicator();
        this.item.set({
            SalesTaxAmountRate : model.get("SalesTaxAmountRate")
        });

第二个看起来像这样:

_cartItem.on('sync', _(function(model, response, options) {
    this.TaxChangeSaveSuccess(model, response, options, item);
})).bind(this));

//...

TaxChangeSaveSuccess : function(model, response, options, item) {
    // Same stuff you have already

您还可以使用_.binditem 提供给使用bind 的部分应用程序功能的回调函数。还有其他设置包装器的方法,我只是在这里简单易懂。

哪一种更适合你取决于你的具体情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多