【问题标题】:Backbone and user confirmation - jquery defer and promises骨干网和用户确认 - jquery defer 和 promise
【发布时间】:2014-11-20 03:55:25
【问题描述】:

我第一次使用 jQuery defer 和 promises,我遇到了一些困惑,我希望有人为我澄清一下,我有一个复选框,它决定了 a模型属性。我想在用户检查此输入时进行确认,并根据肯定或否定响应从那里开始。

到目前为止,我的模型视图中有这个,

App.Views.UserInitialsWithAdmin = Backbone.View.extend({

className : 'avatar-member',

template: _.template( $('#tpl-person-initials-with-admin').html() ),

events: {
    "change input[type=checkbox]" : "changeAdmin"
},

initialize: function() {
    this.model.on('change:is_admin', this.doAdmin, this );
},

changeAdmin: function(e) {
    var element = $(e.currentTarget);
    if(element.is(':checked')) {
        this.model.set('is_admin', true);
    } else {
        this.model.set('is_admin', false);
    }
},

doAdmin: function() {

    var self = this;
    var notify = new Pops.Views.ConfirmationView({
        message : "Are you sure?"
    });
    $.when(notify.render().promise)
        .then(function() {
           console.log("the user wants to change the admin");
        }).fail(function() {
            console.log("the user does not want to change the admin");
        });

}

});

所以目前,我只想记录用户想要做什么,这是我的确认视图,

'use strict'

App.Views.ConfirmationView = Backbone.View.extend({

tagName: 'div',
className: 'notification',

template: _.template( $('#tpl-cofirmation').html() ),

initialize: function(options) {
    this.options = options;
    console.log(this);
},

events: {
    "click .js-cancel" : "cancel",
    "click .js-confirm": "confirm"
},

render: function() {
    //var self = this;
    console.log(this);
    this.$el.html(this.template({
        message: this.options.message
    })).css({'z-index':'9999', 'position':'absolute', 'padding':'10px', 'background':'#fff'}).prependTo('.app');

    this.deferred = $.Deferred();

    return this.deferred;
},

cancel: function() {
    this.$el.hide();
    this.deferred.reject();
},

confirm: function() {
    this.$el.hide();
    this.deferred.resolve();
}

});

我遇到的问题是,无论我在确认中单击什么,模型视图总是我给出积极响应并记录“用户想要更改管理员” - 我真的是推迟事情的新手所以任何帮助都会很棒!

【问题讨论】:

    标签: jquery backbone.js promise jquery-deferred


    【解决方案1】:

    我并不是说您不能或不应该为此使用 Promise,但您是否考虑过使用 Backbone 的内置事件功能?例如,您可以从 ConfirmationView 触发事件,将需要记录到控制台的特定消息传递回 UserInitialsWithAdminView。

    【讨论】:

    • 这将如何工作?我想我可以从另一个没有该模型的视图中操作模型?
    • 查看 Backbone 的 trigger 和 listenTo 方法。基本思想是您的管理视图将侦听从确认视图触发的一个或多个事件。然后,您的管理员视图可以根据用户在对话框中选择确认还是取消做出相应的反应。如果两个视图都需要访问同一个模型,您可以在实例化它们时将其传递给它们。
    【解决方案2】:

    我认为 .then() 总是在 $.when 上被调用。你试过用 .done() 代替 .then 吗?

    http://api.jquery.com/jquery.when/

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2012-02-18
      • 2014-09-05
      相关资源
      最近更新 更多