Событие изменения магистрали не запускается

Я изучаю Backbone и попал в одно место. Я хотел загрузить модель при загрузке страницы. Итак, у меня есть код ниже.

<html>
<head>
    <script src="js/jquery.min.js"></script>
    <script src="js/underscore-min.js"></script>
    <script src="js/backbone-min.js"></script>
    <script src="js/json2.js"></script>
</head>
<body>
    <h1></h1>
    <div id="poview"></div>
    <script id="poTemplate" type="text/template">
        <td><%= Ponumber %></td>
        <td><%= Posuppliername %></td>
        <td><%= Postatusname %></td>
        <td><%= Podate %></td>
        <td><%= DispOrderTotal %></td>
    </script>
    <script type="text/javascript">
        (function($) {
            var PO = Backbone.Model.extend()

            var POList = Backbone.Collection.extend({
                url: 'po.json',
                model: PO,
                parse: function(response) {
                    console.log(response.PurchaseOrder)
                    return response.PurchaseOrder
                }
            })

            var POView = Backbone.View.extend({
                tagName: 'tr',
                template: $('#poTemplate').html(),
                initialize: function() {
                    _.bindAll(this, 'render')
                    this.model.bind('change', this.render)
                },
                events: {
                    'click': 'click'
                },
                render: function() {
                    console.log('po render')
                    var tmpl = _.template(this.template)
                    $(this.el).html(tmpl(this.model.toJSON()))
                    return this;
                },
                click: function() {
                    console.log('clicked....')
                }
            })

            var POListView = Backbone.View.extend({
                el: $('#poview'),
                initialize: function() {
                    _.bindAll(this, 'render', 'appendPO')
                    this.collection = new POList()
                    this.collection.bind('change', this.render, this)
                    this.collection.bind('add', this.render, this)
                    this.collection.fetch({add:true})
                },
                render: function() {
                    var self = this;
                    console.log(this.collection.models)
                    this.collection.each(function(po) {
                        self.appendPO(po)
                    }, this)
                },
                appendPO: function(po) {
                    var poView = new POView({
                        model: po
                    });
                    console.log(po)
                    $(this.el).append(poView.render().el)               
                }
            });

            var poListView = new POListView()

        })(jQuery)
    </script>
</body>
</html>

И ниже ответ json от сервера

{
    "@totalCount": "1134",
    "PurchaseOrder": [
        {
            "ID": "689600",
            "Ponumber": "K037412201",
            "Poname": "",
            "Podate": "2011-12-26T10:03:24.000+05:30",
            "Posuppliername": "XYZ UPS Supplier",
            "Postatusname": "Approved - Supplier Received",
            "DispOrderTotal": "$1.99"
        },
        {
            "ID": "689601",
            "Ponumber": "K037412202",
            "Poname": "",
            "Podate": "2011-12-26T10:03:24.000+05:30",
            "Posuppliername": "ABC UPS Supplier",
            "Postatusname": "Approved - Supplier Received",
            "DispOrderTotal": "$1.99"
        }
    ]
}

Но когда страница загружается, метод рендеринга в POListView не запускается. В чем проблема в этом коде?

Изменить

jQuery(function($){
  ...
});

Если я также использую вышеуказанное соглашение, это не сработает.

Рабочий пример См. ответ от @JayC

<html>
<head>
    <script src="js/jquery.min.js"></script>
    <script src="js/underscore.js"></script>
    <script src="js/backbone.js"></script>
    <script src="js/json2.js"></script>
</head>
<body>
    <h1></h1>
    <div id="poview"></div>
    <script id="poTemplate" type="text/template">
        <td><%= Ponumber %></td>
        <td><%= Posuppliername %></td>
        <td><%= Postatusname %></td>
        <td><%= Podate %></td>
        <td><%= DispOrderTotal %></td>
    </script>
    <script type="text/javascript">

        jQuery(function($) {
            var PO = Backbone.Model.extend({
                idAttribute: 'ID'
            })

            var POList = Backbone.Collection.extend({
                url: 'po.json',
                model: PO,
                parse: function(response) {
                    console.log('parse')
                    return response.PurchaseOrder
                }
            })

            var POView = Backbone.View.extend({
                tagName: 'tr',
                template: $('#poTemplate').html(),
                initialize: function() {
                    _.bindAll(this, 'render', 'click')
                },
                events: {
                    'click': 'click'
                },
                render: function() {
                    var tmpl = _.template(this.template)
                    $(this.el).html(tmpl(this.model.toJSON()))
                    return this;
                },
                click: function() {
                    console.log('clicked.... ' + this.model.id)
                }
            })

            var POListView = Backbone.View.extend({
                el: $('#poview'),
                initialize: function() {
                    _.bindAll(this, 'render', 'appendPO')
                    this.collection = new POList()
                    this.collection.bind('reset', this.render, this)
                    this.collection.fetch()
                },
                render: function() {
                    var self = this;
                    console.log(this.collection.models)
                    this.collection.each(function(po) {
                        self.appendPO(po)
                    }, this)
                },
                appendPO: function(po) {
                    var poView = new POView({
                        model: po
                    });
                    $(this.el).append(poView.render().el)               
                }
            });

            var poListView = new POListView()

        });
    </script>
</body>
</html>

person Jaydeep Patel    schedule 16.03.2012    source источник


Ответы (2)


Я не вижу привязки к событию reset для вашей коллекции. Документация Backbone.js теперь содержит часто задаваемые вопросы, объясняющие события (наконец-то!) и из него видно, что событие reset срабатывает, когда все содержимое коллекции было заменено. В коллекциях это то, что обычно делает fetch.

person JayC    schedule 16.03.2012
comment
Большой. Сейчас это работает. Я сделал два изменения. Тот, который предложил @JayC, используя событие сброса и используя Backbone 0.9.1 вместо 0.3.3. Не уверен, что было проблемой с 0.3.3. - person Jaydeep Patel; 17.03.2012

Вы написали это, которое немедленно выполняет функцию, когда DOM еще не готов/доступен:

(function($){
  ...
})(jQuery);

Но, вероятно, вы хотели написать это (см. http://api.jquery.com/jQuery/#jQuery3 ), что откладывает выполнение функции до тех пор, пока документ не будет готов к обработке (прикрепление ваших представлений и т. д.):

jQuery(function($){
  ...
});

Конечно, в jQuery() должен быть заключен только фактический вызов инициализации, остальные части могут оставаться в простом замыкании.

person biziclop    schedule 16.03.2012
comment
К сожалению, это не работает. У меня есть вывод журнала в методе рендеринга, который также не печатается. - person Jaydeep Patel; 16.03.2012
comment
На самом деле загружено достаточное количество DOM. Я видел несколько магистральных примеров, где скрипты для инициализации были помещены ближе к концу тела, и они работают (действительно, я думаю, что мой проект работает именно так... все определения находятся вверху, но скрипт для инициализации - это включены внизу). Почему мы должны это делать? Я не уверен. Я где-то читал, что добавление нескольких функций DOMReady на самом деле может замедлить работу страницы, но я не уверен, что это было причиной. - person JayC; 16.03.2012