【问题标题】:Spine.js Unknown Record (possible scope error?)Spine.js 未知记录(可能的范围错误?)
【发布时间】:2013-02-02 07:15:09
【问题描述】:

如果我有一个“专辑”列表,然后单击其中一个,我会导航到另一个视图 (/#/album/:id),该视图由名为 SingleAlbum 的控制器控制。它正确地获取数据,但我无法让它呈现。我查看了 SO 和 Spine Google Group 上的其他“未知记录”问题,但没有骰子。这是我的代码:

var SingleAlbum = Spine.Controller.sub({
    apiObj: {
        url: '/api/album',
        processData: true,
        data: {
            id: ''
        }
    },
    model: Album,
    panel: $('.album_single'),
    tmpl: $('#albumTpl'),

    init: function() {
        this.apiObj.url = this.model.url;
        if(this.panel.children.length > 0) {
            this.panel.html('');
        }
    },
    render: function(id) {
        console.log('render');

        var template = singleAlbum.tmpl.html(),
            data = Album.find(id), //  <--  this doesn't want to work
            html = Mustache.to_html(template, data);
        singleAlbum.panel.html(html);
    },
    getData: function(id) {
        //var me = this;
        console.log('get data');
        this.apiObj.data.id = id;
        this.apiObj.url = this.model.url;

        this.model.bind('refresh change', function(id) {
            //me.render(id);
            singleAlbum.render(id);
            console.log('should be rendered');
        });

        this.model.fetch(this.apiObj);
        console.log('record: ',this.model.find(id));
        if(Object.keys(this.model.find(id)).length > 0) {
            //this.render(id);
        }
    }   

});

当我在事件处理程序上调用 .render() 时会出现问题。我可以手动查看 Album.all() 有记录,并且可以在应用程序的其他任何地方执行 Album.find(id),但是当我在 var data = Album.find(id) 上执行此操作时失败。这是范围问题吗?我错过了什么明显的东西吗?

顺便说一句,请原谅我的代码冗长。我实际上正在制作一个 SingleItem 控制器,其中 SingleArtist 和 SingleAlbum 将是子类。我认为这可能是一个问题,所以我撕掉了代码来自己测试它。

编辑:具体来说,我的路线如下所示:

'/album/:id': function(params) {
    console.log('navigated to /album/', params.id);
    singleAlbum.getData(params.id);
}

【问题讨论】:

    标签: javascript spine.js


    【解决方案1】:

    啊哈!我在我的事件处理程序中传递了id,它覆盖了另一个 id 变量。它应该是这样的:

    render: function(id) {
            var template = this.tmpl.html(),
                data = this.model.find(id),
                html = Mustache.to_html(template, data);
            this.panel.html(html);
    },
    getData: function(id) {
            var me = this;
            this.apiObj.data.id = id;
            this.apiObj.url = this.model.url;
    
            this.model.bind('refresh change', function() {  //  <--  don't need to pass anything
                me.render(id);
            });
    
            this.model.fetch(this.apiObj);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2017-04-19
      • 1970-01-01
      相关资源
      最近更新 更多