1

我对 Durandal 很陌生,但考虑到我在 jQuery 和一点 KnockoutJS 方面的背景,我认为它是一个很棒的框架,但是我遇到了似乎是在 Durandal 中使用 RequireJS 的两种不同方法。

在 Durandal 示例中,使用了以下语法: Durandal / App / samples / modal / index.js

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

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

这里的依赖项/要求(这是正确的词吗?)被定义为调用 define ( ['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 框架为我定位依赖项,第二个似乎是服务定位器反模式。

我对这两种方法的解释是否正确,应该使用第一种方法,并且文档是错误的(!)?

如果不是,这两种方法的优缺点是什么?建议使用哪一个,为什么?

非常感谢

4

2 回答 2

3

我认为无论你最喜欢哪种方式都是要走的路。我认为 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) { //... });
于 2013-03-25T16:34:09.943 回答
0

两种方式都是正确的。请浏览 Require JS 文档。Durandal JS 建立在 JQuery、Knockout 和 RequireJS 之上。浏览这篇博文。

于 2013-03-28T18:59:03.183 回答