Backbone.js在set()调用之后更改事件未触发,类似于成功调用

时间:2014-04-12 20:02:43

标签: javascript backbone.js

我在两种情况下更改了MyModel的longitudelatitude属性,但我的MyView只注意到其中一个:

  • 当FAKE_LOCATION == true时,我在update中设置(lat,long)并且未触发任何更改事件
  • 当FAKE_LOCATION == false时,我在navigator.geolocation.getCurrentPositionsuccess的回调中设置(lat,long)并且更改事件被触发

var MyModel = Backbone.Model.extend({
    initialize: function() {
        _.bindAll(this,'success','update');
        this.update();
    },

    update: function() {
        if(!FAKE_LOCATION){
            if(navigator.geolocation)
                navigator.geolocation.getCurrentPosition(this.success);
        }else{
            this.set({
                latitude : 37,
                longitude : -122
                                    //previously, I was using constants here
            });
        }
    },

    success: function(position) {
        this.set({
            latitude : position.coords.latitude,
            longitude : position.coords.longitude
        });
    }
});

var MyView = Backbone.View.extend({
    initialize: function(){
        this.listenTo(this.model,'change', this.render);
    }
});

var myModel = new MyModel();
var myView = new MyView({ model : myModel }); 

1 个答案:

答案 0 :(得分:0)

假设FAKE_LOCATION_LATFAKE_LOCATION_LONG是常量,那么您在latitude方法初始化期间设置longitude.initialize()。对[{1}}的后续调用实际上不会更改该值,因此不会发生任何更改,也不会触发.set()个事件。

将此添加到您的代码中以确保值实际更改:

change