0

バックボーン モデル、ボード:

 define([
  'underscore',
  'backbone',
  'collections/lists',
  'iobind',
  'iosync'
], function( _, Backbone, Lists,ioBind,ioSync) {

  var BoardModel = Backbone.Model.extend({
    urlRoot: 'board',
    noIoBind: false,
    socket: io.connect(''),
    idAttribute: '_id',

    defaults: {
      title: 'One Thousand and One Nights'
    },

    initialize: function() {
      this.id = 1;
      this.lists = new Lists;
      this.socket.emit('joinBoard',this.id);

      _.bindAll(this, 'getBoard');
      this.ioBind('initBoard', this.getBoard, this);
    },

    getBoard: function(data){
      this.set(data.data.board[0]);
    }
  });

  return BoardModel;
});

バックボーン ビュー: boardView:

var IndexView = Backbone.View.extend({

    // Instead of generating a new element, bind to the existing elements in the HTML.
    el: '#board',

    // Board template html
    template: Mustache.render(Template.board),

    events: {

    },

    initialize: function() {
      //Init Data
      this.model = new Board();
//      var lists = {
//        lists: [
//          {name: "To Do",
//            cards:[
//              {name: "Art work for A."},
//              {name: "B Prototype."},
//              {name: "C prototype."}
//            ]
//          },
//          {name: "Doing",
//            cards: [
//              {name: "Art work for A."}
//            ]
//          },
//          {name: "Done"}
//        ]
//      }
//      var partial = {card: Template.card_in_list};
//      var listHtml = Mustache.render(Template.list,lists,partial);
//      template = $(this.template).find('.list-area').append(listHtml);
    },

    render: function() {

      console.log(this.model);
      console.log(this.model.toJSON());

      var partial = {card: Template.card_in_list};
      var listHtml = Mustache.render(Template.list,this.model,partial);
      template = $(this.template).find('.list-area').append(listHtml);
      this.$el.html(template);
    }

  });

View 関数: render 関数では、console.log の結果が異なります。console.log(this.model) は正しいオブジェクト結果を取得できます:

child
_callbacks: Object
_changing: false
_escapedAttributes: Object
_ioEvents: Object
_pending: Object
_previousAttributes: Object
_silent: Object
attributes: Object
__v: 0
_id: "50b750a7795f285d4e000014"
created: "2012-11-29T12:10:15.269Z"
description: "simple is better, but not simpler"
dueDate: "2012-11-29T12:10:15.269Z"
lists: Array[6]
status: true
title: "test board unique"
__proto__: Object
changed: Object
cid: "c1"
getBoard: function () { [native code] }
id: "50b750a7795f285d4e000014"
lists: child
__proto__: ctor

ただし、 this.model.toJSON() はモデルのデフォルト値のみを取得します:

Object
title: "One Thousand and One Nights"
__proto__: Object

それは私を混乱させます。同じモデルが異なる結果を得る理由は誰でも知っています。

4

2 に答える 2

0

バックボーン モデルでは、ビジネス値 (説明、タイトルなど) がattributes属性に格納されます。toJSON()モデルを呼び出すと、attributes値が取得され、Backbone.Model オブジェクト フレームワークの関数と属性が削除されます。

モデル属性を手動で設定したい場合は、 を使用しますsetdata.dataオブジェクトの内容がわからないので、ドキュメントを確認してください: http://backbonejs.org/#Model-set

設定 model.set(attributes, [options])

モデルに属性のハッシュ (1 つまたは複数) を設定します。{silent: true} がオプションとして渡されない限り、いずれかの属性がモデルの状態を変更すると、「変更」イベントがトリガーされます。特定の属性の変更イベントもトリガーされ、それらにもバインドできます。たとえば、change:title、change:content などです。個々のキーと値を渡すこともできます。

note.set({title: "3月20日", content: "彼の目には日食…"});

book.set("タイトル", "ボヘミアのスキャンダル"); モデルに検証メソッドがある場合、属性が設定される前に検証され、検証が失敗しても変更は行われず、set は false を返します。それ以外の場合、set はモデルへの参照を返します。オプションでエラー コールバックを渡すこともできます。これは、検証が失敗した場合に、「エラー」イベントをトリガーする代わりに呼び出されます。{silent: true} がオプションとして渡された場合、検証は次の変更まで延期されます。

于 2012-12-01T16:33:11.843 に答える
0

boardView.render を 2 回トリガーすることがわかりました。コードを変更すると:

a = new boardView;
a.render();

a = new boardView;

私は物事をやり遂げました。

ところで、マルセル・ファリエールのコメントに感謝します。

于 2012-12-09T14:08:13.517 に答える