Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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
Backbone.js 调用initialize()初始化视图可以吗?_Backbone.js - Fatal编程技术网

Backbone.js 调用initialize()初始化视图可以吗?

Backbone.js 调用initialize()初始化视图可以吗?,backbone.js,Backbone.js,在我的主干应用程序中,我有以下内容 playlistView = new PlaylistView({ model: Playlist }); Playlist.getNewSongs(function() { playlistView.initialize(); }, genre, numSongs); Playlist.getNewSongs()在某个ajax请求完成时被回调。我想重新初始化视图。然而,我相信我这样做的方式会导致一种观点,即听同一事件两次。这样调用ini

在我的主干应用程序中,我有以下内容

  playlistView = new PlaylistView({ model: Playlist });
  Playlist.getNewSongs(function() {
    playlistView.initialize();
  }, genre, numSongs);
Playlist.getNewSongs()
在某个ajax请求完成时被回调。我想重新初始化视图。然而,我相信我这样做的方式会导致一种观点,即听同一事件两次。这样调用
initialize()
是否可以接受?如果没有,我应该怎么做

更新:

我在《主干》中写这篇文章是为了学习主干,目前它正处于设计地狱之中。我正处于重构整个代码库的中间。下面的代码段是我的PlayView initialize()代码块

  var PlaylistView = Backbone.View.extend({
    el: '#expanded-container',

    initialize: function() {
      var playlistModel = this.model;
      var bg = chrome.extension.getBackgroundPage();

      if (!bg.player) {
        console.log("aborting playlistView initialize because player isn't ready");
        return;
      }

      this.listenTo(playlistModel.get('songs'), 'add', function (song) {
        var songView = new SongView({ model: song });
        this.$('.playlist-songs').prepend(songView.render().el);
      });

      this.$('#song-search-form-group').empty();
      // Empty the current playlist and populate with newly loaded songs
      this.$('.playlist-songs').empty();
      var songs = playlistModel.get('songs').models;

      // Add a search form
      var userLocale = chrome.i18n.getMessage("@@ui_locale");
        var inputEl = '<input class="form-control flat" id="song-search-form" type="search" placeholder="John Lennon Imagine">' +
          '<a href="javascript:void(0)" id="open-favorites"><span class="search-heart-icon fa fa-heart"></span></a>'+
          '<span class="search-input-icon fui-search"></span>';
      }
      this.$('#song-search-form-group').append(inputEl);
      var form = this.$('input');
      $(form).keypress(function (e) {
        if (e.charCode == 13) {
          var query = form.val();
          playlistModel.lookUpAndAddSingleSong(query);
        }
      });

      // Fetch song models from bg.Songs's localStorage
      // Pass in reset option to prevent fetch() from calling "add" event
      // for every Song stored in localStorage
      if (playlistModel.get('musicChart').source == "myself") {
        playlistModel.get('songs').fetch({ reset: true });
        songs = playlistModel.get('songs').models;
      }

      // Create and render a song view for each song model in the collection
      _.each(songs, function (song) {
        var songView = new SongView({ model: song });
        this.$('.playlist-songs').append(songView.render().el);
      }, this);

      // Highlight the currently played song
      var currentSong = playlistModel.get('currentSong');
      if (currentSong)
        var currentVideoId = currentSong.get('videoId');
      else {
        var firstSong = playlistModel.get('songs').at(0);
        if (!firstSong) {
          // FIXME: this should be done via triggering event and by Popup model
          $('.music-info').text(chrome.i18n.getMessage("try_different_chart"));
          $('.music-info').fadeOut(2000);
          //console.log("something wrong with the chart");
          return;
        }
        var currentVideoId = firstSong.get('videoId');
      }

      _.find($('.list-group-item'), function (item) {
        if (item.id == currentVideoId)
          return $(item).addClass('active');
      });

    },
var playliView=Backbone.View.extend({
el:“#扩展容器”,
初始化:函数(){
var-model=this.model;
var bg=chrome.extension.getBackgroundPage();
如果(!bg.player){
log(“正在中止播放视图初始化,因为播放器尚未准备就绪”);
返回;
}
this.listenTo(playlimodel.get('songs'),'add',函数(song){
var songView=new songView({model:song});
这是$('.playlist songs').prepend(songView.render().el);
});
此.$(“#歌曲搜索表单组”).empty();
//清空当前播放列表并填充新加载的歌曲
此.$('.playlist songs').empty();
var songs=playlimodel.get('songs').models;
//添加搜索表单
var userLocale=chrome.i18n.getMessage(“@@ui_locale”);
变量输入=“”+
''+
'';
}
这个.$(“#歌曲搜索表单组”).append(inputEl);
变量形式=此。$(“输入”);
$(表格)。按键(功能(e){
如果(e.charCode==13){
var query=form.val();
playlimodel.lookupandddsinglesong(查询);
}
});
//从bg.Songs的本地存储中获取歌曲模型
//传入重置选项以防止fetch()调用“add”事件
//对于存储在localStorage中的每首歌曲
if(playlimodel.get('musicChart')。source==“我自己”){
playlimodel.get('songs').fetch({reset:true});
歌曲=播放模式。获取('songs')。模式;
}
//为集合中的每个歌曲模型创建和渲染歌曲视图
_.每个(歌曲、功能(歌曲){
var songView=new songView({model:song});
这个.$('.playlist songs').append(songView.render().el);
},这个);
//突出显示当前播放的歌曲
var currentSong=playlimodel.get('currentSong');
如果(当前歌曲)
var currentVideoId=currentSong.get('videoId');
否则{
var firstSong=playlimodel.get('songs')。位于(0);
如果(!第一首歌){
//修复:这应该通过触发事件和弹出模型来完成
$('.music info').text(chrome.i18n.getMessage(“尝试不同的图表”);
$(“.music info”).fadeOut(2000年);
//log(“图表有问题”);
返回;
}
var currentVideoId=firstSong.get('videoId');
}
_.find($('.list-group-item'),函数(item){
如果(item.id==currentVideoId)
返回$(item).addClass('active');
});
},

这没有错,但可能不是一个好的做法。您没有在
初始化中发布代码,但可能您的逻辑太多了

如果只是再次初始化视图以便呈现新数据,则应使用事件侦听器:

myView = Backbone. View.extend ({
    initialize : function() {
         // We bind the render method to the change event of the model. 
         //When the data of the model of the view changes, the method will be called.
         this.model.bind( "change" , this.render, this);   

        // Other init code that you only need once goes here ...
        this.template = _.template (templateLoader. get( 'config'));
    },

    // In the render method we update the view to represent the current model
    render : function(eventName) {    
        $ (this.el ).html(this .template ((this.model .toJSON())));      
        return this;        
    }

});

如果您的
initialize
中的逻辑完全是另一种逻辑,请将其包括在内。可能有一个更好的地方可以容纳它。

像这样调用
initialize
是不“正常”的。乍一看,听起来您在
initialize
中尝试了太多。