Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Backbonejs,此在视图中的行为,未捕获的TypeError_Javascript_Backbone.js_Cordova - Fatal编程技术网

Javascript Backbonejs,此在视图中的行为,未捕获的TypeError

Javascript Backbonejs,此在视图中的行为,未捕获的TypeError,javascript,backbone.js,cordova,Javascript,Backbone.js,Cordova,解决了?不完全是 这是一款Cordova+主干移动应用程序。我一直在用我的头撞这个有一段时间了,我想是时候寻求一些帮助了 App.PhotoButtonView = Backbone.View.extend({ pic: "", picid: 1, events : { "click #addPhotoBtn": "addPhoto" }, initialize: function( options ) { this.options = options; }, render

解决了?不完全是

这是一款Cordova+主干移动应用程序。我一直在用我的头撞这个有一段时间了,我想是时候寻求一些帮助了

App.PhotoButtonView = Backbone.View.extend({
pic: "",
picid: 1,

events : {
    "click #addPhotoBtn": "addPhoto"
},

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

    var html = JST['photo-button/view']({num: this.options.picid});
    $(this.el).html( html );

    setTimeout(this.postrender, 0);
    return this;
},

postrender: function() {
    // reset to default image pic
    console.log('addPhotoBtn' + this.options.picid);
    document.getElementById('addPhotoBtn' + this.options.picid ).src =   this.pic;
    var photo = document.querySelector("#addPhotoBtn" + this.options.picid);
},
我还是

错误:未捕获类型错误:无法读取未定义的属性“picid”

但现在它是由postrender函数触发的。我打赌这和这个设定超时黑客有关

编辑:这是父视图中初始化PhotoButtonView的代码

postrender: function() {
    $('#submitBtn, .topcoat-button--large').prop('disabled', false);

    this.photo = new App.PhotoButtonView({picid: 1});
    $('#photoButtons').html(this.photo.render().el);

    if (App.activePost.get('photo1')) {
    this.photo2 = new App.PhotoButtonView({picid: 2});
    $('#photoButtons').append(this.photo2.render().el);
    }

    if  (App.activePost.get('photo2')) {
    this.photo3 = new App.PhotoButtonView({picid: 3});
    $('#photoButtons').append(this.photo3.render().el);
    }

    if  (App.activePost.get('photo3')){
    this.photo4 = new App.PhotoButtonView({picid: 4});
    $('#photoButtons').append(this.photo4.render().el);
    }

},

注:一名二年级的CS实习生编写了此代码库。我正在修补新功能。

这看起来像是绑定此的常见错误

因为我们将
this.postrender
回调未绑定到setTimout,所以它将在全局命名空间的范围内被称为“函数”样式,并且
this
将绑定到全局对象,而不是视图

有两种方法可以调整setTimeout调用,以便在postrender方法中引用
this
时正确绑定它

选项1(调用/应用样式):

选项2(方法样式):

这里有一篇Yehuda Katz写的关于
这个
和调用的非常好的文章。

如何初始化视图?(注:您可能指的是tagName,默认情况下它是'div',因此无需指定它)您可能想发布引发错误的实际代码。我在文档()中看不到关于init参数泄漏到initialize()的证据。你应该依靠
这个.options
来代替。Enders,我添加了一些代码,我称之为new Nikolay,据我所知,这是引发我错误的实际代码。我还需要去哪里看?jhohlfeld,当我有结果时,我将编辑此注释。jhohlfeld,this.options在初始化中未定义。
setTimeout(this.postrender.bind(this), 0);
var that = this;
setTimeout(function () {
  that.postrender();
}, 0);