2014-11-02 4 views
0

Здесь моя проблема, я хочу динамически менять свою модель (динамически меняю переменную в моей модели при создании экземпляра).Динамическая смена базовой модели

Так вот мой код:

define(['backbone'], function (backbone) { 

    var MyModel = Backbone.Model.extend({ 
    initialize: function() { 
     var that = this; 
     var likes; 
     var UrlGetLike = "https://api.facebook.com/method/fql.query?query=select%20like_count%20from%20link_stat%20where%20url=%27https://www.facebook.com/pages/Stackoverflow/1462865420609264%27&format=json"; 
     $.getJSON(UrlGetLike, { 
      format: "json" 
     }) 
     .done(function(data) { 
      likes = data[0].like_count; 
      that.set({ 
       'likes' : likes 
      }); 
     }); 
    }, 
    }); 
return MyModel; 
}); 

Но данные не обновляются, MyModel возвращается до .done() закончил ..

Я это тоже попробовать:

define(['backbone'], function (backbone) { 

    var MyModel = Backbone.Model.extend({ 
    initialize: function() { 
     var that = this; 
     var likes; 
     var UrlGetLike = "https://api.facebook.com/method/fql.query?query=select%20like_count%20from%20link_stat%20where%20url=%27https://www.facebook.com/pages/Stackoverflow/1462865420609264%27&format=json"; 
     $.getJSON(UrlGetLike, { 
      format: "json" 
     }) 
     .done(function(data) { 
      likes = data[0].like_count; 
      that.set({ 
       'likes' : likes 
      }); 
      that.returnn; 
     }); 
    }, 
    returnn: function(){ 
     return this; 
    } 
    }); 
}); 

Но я получил эту ошибку Не могу прочитать свойство «прототип» неопределенного, потому что я выстрелил

var collection = new Collection({collection : MyModel}); 

Перед тем, как MyModel вернется (я думаю)

Если у кого-то есть решение или что-то, что мне поможет, было бы полезно :).

+0

Итак, вы решили свою проблему? – Mironor

ответ

1

Вы можете получить информацию для каждой модели в коллекции после ее создания (на самом деле это плохо, чтобы получить данные в методе initialize, поскольку этот метод не был создан для этой цели. Лучше всего вызвать метод fetch для модели явно (в нашем случае давайте назовем его fetchLikes))

var MyModel = Backbone.Model.extend({ 
     fetchLikes: function() { 
      var UrlGetLike = "https://api.facebook.com/method/fql.query?query=select%20like_count%20from%20link_stat%20where%20url=%27https://www.facebook.com/pages/Stackoverflow/1462865420609264%27&format=json"; 
      $.getJSON(UrlGetLike, { 
       format: "json" 
      }, _.bind(function (data) { 
       likes = data[0].like_count; 
       that.set({ 
        'likes': likes 
       }); 
      }, this)); 
     } 
    }); 

    var Collection = Backbone.Collection.extend({ 
     model: MyModel 
    }) 

    var collection = new Collection(); 

    //.. insert models in the colleciton .. 

    collection.forEach(function (model) { 
     model.fetchLikes(); 
    }) 

Bare в виду, что вы делаете ajax запросы в for-loop, который считается плохой практикой. Выполняйте это только в том случае, если у вас нет возможности получить все данные по одному запросу.

Смежные вопросы