1

我是骨干新手,只是学习基础知识。我正在建立一个带骨干的图片库。我正在显示图像的大版本。路由工作正常。当一个带有 id 的 url 被传递时,适当的 JSON 被加载到模型中,并且 html 被注入到 dom 中。一切都按预期显示。

但是,我尝试为不存在的图像输入 JSON 的 url,并注意到该视图仍然呈现,但之前呈现的视图的属性(图像 url)仍然存在。如何确保刷新视图 - 所有空属性?还是需要刷新的模型?

注意:我正在重用视图以避免创建和破坏视图本身的开销。

这是有问题的观点:

var ImageView = Backbone.View.extend({
    template: Handlebars.compile(
        '<div class="galleryImageSingle">'+
        '<h2>{{title}}</h2>' +
        '<img id="image" src="{{imageUrl}}" class="img-polaroid" />' +
        '<div class="fb-share share-btn small"><img src="img/fb-share-btn-    small.png"/></div>'+
        '</div>' +
        '<div class="black-overlay"></div>'
    ),

    initialize: function  () {
        this.listenTo(this.model, "change", this.render);
        //this.model.on('change',this.render,this); 
    },

    fbSharePhoto: function () {
        console.log('share to fb ' + this.model.attributes.shareUrl)
    },

    close: function () {

      //this.undelegateEvents();
      this.remove();
    },

    render: function () {

        this.$el.html(this.template(this.model.attributes));
        this.delegateEvents({
            'click .fb-share'               : 'fbSharePhoto',
            'click .black-overlay'          : 'close'
        });

        return this;
    }
})

这是路由器:

    var AppRouter = Backbone.Router.extend({
    routes: {
        ""                      :           "dashboard",
        "image/:iId"            :           "showImage", 
    },

    initialize: function  () {

        // this.galleriesCollection = new GalleriesCollection(); //A collection of galleries
        // this.galleriesCollection.fetch();

        this.imageModel         = new Image(); 
        this.imageView          = new ImageView ({  model: this.imageModel });

    },

    dashboard: function () {
        console.log('@AppRouter show dashboard - hide everything else');

        //$('#app').html(this.menuView.render().el);
    },

    showImage: function (iId) {
        console.log('@AppRouter showPhoto() ' + iId);
        this.imageModel.set('id', iId);
        this.imageModel.fetch();
        $('#imageViewer').html(this.imageView.render().el);
    }


});

模型是否仍然具有旧信息或视图,或两者兼而有之?

对于额外的功劳,我如何通过不触发相应的视图来检测到无法获取和响应它?还是我错了?

提前感谢您的任何建议。

///////////////////////////////////////// ///////////////////////

看起来我发现了一些有用的东西。我认为正确地提出问题的过程有助于回答它。(我不允许回答这个问题,所以我会在这里发布我发现的内容)

在这种情况下,它似乎是需要刷新的模型。在应用程序路由器中,当我调用 showImage 函数时,我会在调用 fetch 之前清除模型并将其值重置为默认值,这起到了作用。具有讽刺意味的是,这里的技巧是显示损坏的图像标签。

showImage: function (iId) {
console.log('@AppRouter showPhoto() ' + iId);
this.imageModel.clear().set(this.imageModel.defaults);
this.imageModel.set('id', iId);
this.imageModel.fetch();
$('#imageViewer').html(this.imageView.render().el);
}

对于我自己的额外信用提议:如果发生错误(如果需要 fetch() 接受选项哈希中的成功和错误回调)。仍然绝对愿意听到有关框架中包含的这样做的方法。

4

1 回答 1

0

您可以像这样更新模型:

ImageView.model.set(attributes)
于 2018-01-12T11:18:11.313 回答