Какой синтаксис RequireJS является правильным в Durandal?

Я очень новичок в Durandal, но думаю, что это отличная структура, учитывая мой опыт работы с jQuery и немного KnockoutJS, однако я столкнулся с двумя разными методами использования RequireJS с Durandal.

В примерах Durandal используется следующий синтаксис: Durandal / App /образцы/модальные/index.js

    define(['durandal/app', './customModal'], function (app, CustomModal) {

    return {
        showCustomModal: function() {
            app.showModal(new CustomModal()).then(function(response) {
                app.showMessage('You answered "' + response + '".');
            });
        }
    };
});

Здесь зависимости/требования (это правильное слово здесь?) определены как первый аргумент вызова для определения (['durandal/app', './customModal']).

В документации Durandal используется следующий синтаксис:Создание модуля

define(function(require){
  var backend = require('backend');

  return {
    customers:ko.observableArray([]),
    activate:function(){
      var that = this;
      return backend.getCustomers().then(function(results){
        that.customers(results);
      });
    }
  };
});

Здесь только функция передается вызову для определения с требованием в качестве зависимости/требования этой функции. Затем вызывается функция require, чтобы получить фактическую зависимость/требование (var backend = require('backend');), которая необходима.

Исходя из фона .net IoC, первый кажется правильным, определите мои требования и позвольте инфраструктуре requirejs найти зависимости для меня, а второй кажется анти-шаблоном локатора службы.

Верна ли моя интерпретация этих двух методов, следует ли использовать первый, а документация неверна(!)?

Если нет, каковы плюсы/минусы этих двух методов? Какой из них целесообразно использовать и почему?

Большое спасибо


person Graham King    schedule 25.03.2013    source источник


Ответы (2)


Я думаю, какой путь вам больше нравится, тот путь. Я думаю, что requirejs сделал так, что вы можете использовать оба способа, чтобы он мог поддерживать формат модуля commonjs.

Согласно сайту requirejs, если вы используете способ, которым Durandal разрешает свои зависимости:

define(function(require) { var app = require('durandal/app');  app.start(); }

«Эта оболочка использует Function.prototype.toString() для получения полезного строкового значения содержимого функции. Это не работает на некоторых устройствах, таких как PS3 и некоторых старых мобильных браузерах Opera». --цитата из requirejs

Но это крайний случай, который, я думаю, не слишком волнует многих. Кроме этого... Я бы просто выбрал то, что подходит вам лучше всего.

Я не уверен, что вы подразумеваете под анти-шаблоном локатора сервисов. Я почти уверен, что оба способа верны, и в любом случае вы решите сделать это исключительно для эстетики.

ИЗМЕНИТЬ**

Durandal больше не использует описанный выше шаблон для разрешения своих зависимостей. Сейчас он используется таким образом:

define(['./app','./system'], function (app, system) { //... });
person Evan Larsen    schedule 25.03.2013

Оба способа правильны. Пожалуйста, ознакомьтесь с документацией Require JS. Durandal JS построен на JQuery, Knockout и RequireJS. Пройдите этот пост в блоге.

person Dilan    schedule 28.03.2013