Как заставить Backbone-Relational (0.8.5) работать с RequireJS?

После очередного долгого исследования выходит sth :-) Похоже, проблема в функции "getObjectByName". Это не может хорошо работать с requireJS (ADM). В настоящее время мне нужно настроить глобальную переменную, чтобы решить эту проблему. Я уверен, что должно быть лучшее решение.

Вот мой временный раствор:

(1) настроить глобальную переменную и настроить область модели поиска на глобальную («ПРИЛОЖЕНИЕ»)

var APP = {};

define(['backbone-relational'], function(){
    Backbone.Relational.store.addModelScope(APP);
})

(2) экспортируйте свою модель отношений в глобальную

APP.YourRelationalModel = YourRelationModel;

Это работает, хотя и не очень хорошо ... Я действительно с нетерпением жду лучшего ответа. Спасибо.

//------------

тестовые версии:

1.Backbone-Relational 0.8.5 
2.Backbone 1.0.0 and Underscore 1.4.4
3.JQuery 1.8.3
4.RequireJS 2.1.5

Код очень прост: (или см. https://github.com/bighammer/test_relational_amd.git)

require.config({

paths : {

    js                    : 'js',
    jquery                : 'js/jquery-1.8.3',
    underscore            : 'js/underscore',
    backbone              : 'js/backbone',
    'backbone-relational' : 'js/backbone-relational'
},

shim : {
    underscore : {
        exports : '_'
    },
    backbone   : {
        deps    : ['underscore', 'jquery'],
        exports : 'Backbone'
    },

    'backbone-relational' : {
        deps: ['backbone']
    }
}

});

define(['backbone', 'backbone-relational'], function (Backbone) {

var Child = Backbone.RelationalModel.extend();
var Parent = Backbone.RelationalModel.extend({
    relations : [
        {
            key          : 'child',
            type         : Backbone.HasOne,
            relatedModel : 'Child'
        }
    ]

});

var test = new Parent();

});

сохраните приведенный выше код в main.js и включите в index.html следующим образом:

Это не работает. Есть предупреждающее сообщение:

Relation=child: missing model, key or relatedModel (function (){ return parent.apply(this, arguments); }, "child", undefined). 

Я прочитал исходный код backbone-relational и знаю, что с пространством имен что-то не так. Relational-Backbone не может найти связанную модель, определенную в «родительском» (т. е. не может найти releatedMode: «дочерний»). Мне не удалось найти решение, чтобы исправить это из-за моего ограниченного знания javascript :-)

Кто-нибудь может мне с этим помочь?

Прежде чем задать свой вопрос, я изучил следующие решения:

Backbone.RelationalModel с использованием requireJs
Не удается заставить Backbone-relational работать с AMD (RequireJS)
Загрузка Backbone.Relational с использованием Use! плагин

Ни один из них не работал в этом случае.


person bighammer    schedule 12.04.2013    source источник
comment
После очередного долгого поиска выходит sth :-) Похоже проблема в функции getObjectByName. Это не может хорошо работать с requireJS (ADM). В настоящее время мне нужно настроить глобальную переменную, чтобы решить эту проблему. Я уверен, что должно быть лучшее решение. Вот мое временное решение: (1) настроить глобальную переменную и настроить область модели поиска на глобальную (приложение) var APP = {}; определить(['базово-реляционная'], function(){ Backbone.Relational.store.addModelScope(APP); }) (2)   -  person bighammer    schedule 12.04.2013


Ответы (2)


Вам не нужно ссылаться на relatedModel по строке, вы можете ссылаться на нее напрямую, поэтому вместо relatedModel: 'Child' просто используйте: relatedModel: Child.

А поскольку вы используете requireJS, вы можете легко ссылаться на модель из другого файла.

define(['backbone', 'models/child', 'backbone-relational'], function (Backbone, Child) {
  var Parent = Backbone.RelationalModel.extend({
    relations : [{
        key          : 'child',
        type         : Backbone.HasOne,
        relatedModel : Child
    }]
  });

  var test = new Parent();
});
person xzhang    schedule 12.04.2013
comment
Большое спасибо. Оно работает. На самом деле, я пытался использовать Reference один раз, но у меня не получилось. Теперь разберитесь, почему это не сработало в тот раз. Это вызвано другой моей ошибкой в ​​исходном коде проекта :( - person bighammer; 13.04.2013

Приведенное выше решение не применимо ко мне. Я постепенно перемещаю код из Rails Asset Pipeline (не RequireJS/AMD/CommonJS/что-то еще) в Webpack, начиная с зависимостей. Когда я переместил требование backbone-relational в подготовку пакета Webpack для своих моделей, а определения отношений все еще находились в Rails Asset Pipeline, я начал получать много необъяснимого Relation=child: missing model, key or relatedModel (function (){ return parent.apply(this, arguments); }, "child", undefined).

В моем случае решение оказалось довольно простым, несмотря на то, что мне потребовалось много времени, чтобы найти его:

// In a Webpack module, later included into Rails Asset Pipeline
// temporarily to facilitate migration

require('expose?Backbone!backbone') // Exposing just for migration
require('backbone-relational')
Backbone.Relational.store.addModelScope(window)

backbone-relational по умолчанию использует свою глобальную область для разрешения основанных на строках relatedModel, но, поскольку это требовалось без глобальной реальной области, решение состоит в том, чтобы просто передать это при использовании addModelScope, чтобы он мог искать в этой области указанный модели.

person Bo Jeanes    schedule 18.11.2016