2

我是杜兰达尔的新手。我试图在 durandal 使用 mimosa skelton 提供的演示应用程序中添加一个新模块。

我按照此步骤创建了模块

当我运行应用程序时出现错误

Uncaught Error: Failed to load routed module (viewmodels/myPage). Details: ko is not defined 

我的模块 backend.js

define(function(require){
  return {
    getCustomers:function(){
      //do some ajax and return a promise
        return $.ajax({
          url: 'http://graph.facebook.com/facebook?callback=?',
          dataType: 'json',
        }).promise();
    }
  };
});

我的 myPage.js

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

    return {
        customer:ko.observable(),
        activate:function(){
          var that = this;
          return backend.getCustomers().then(function(result){
            that.customer(result);
          });
        }
      };
});

我的页面.html

<h1>Getting facebook fan page details using jquery</h1>
<p id="cover-page"></p>
<table class="zebra-style">
    <tr><td>Name </td><td><p class="facebook_name" data-bind="html:name"></p></td></tr>
    <tr class="odd"><td>About </td><td><p class="facebook_about"></p></td></tr>
    <tr><td>No of Likes </td><td><p class="facebook_likes"></p></td></tr>
    <tr  class="odd"><td>Website </td><td><p class="facebook_website"></p></td></tr>
    <tr><td>Category </td><td><p class="facebook_category"></p></td></tr>
    <tr class="odd"><td>Founded </td><td><p class="facebook_founded"></p></td></tr>
    <tr><td>Fan Page Url </td><td><p class="facebook_link"></p></td></tr>
    <tr  class="odd"><td>People Talking About Your Page </td><td><p class="facebook_talk_count"></p></td></tr>
</table>

我做错了什么?如何解决这个问题?

4

2 回答 2

4

由于 Durandal 2.0 Knockout 不再是全局依赖,而是通过 RequireJs 加载。

因此,您需要调用var ko = require('knockout');您的模块以使 Knockout 可用:

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

    return {
        customer:ko.observable(),
        activate:function(){
          var that = this;
          return backend.getCustomers().then(function(result){
            that.customer(result);
          });
        }
      };
});
于 2013-10-31T07:58:46.507 回答
1

ko在 myPage.js 内部使用时没有告诉 require 它是必需的。使用与上面相同的 common.js 语法并假设您knockout为此定义了一个路径,则声明了依赖项。

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

    return {
        customer:ko.observable(),
        activate:function(){
          var that = this;
          return backend.getCustomers().then(function(result){
            that.customer(result);
          });
        }
      };
});

虽然 AMD 对 jquery 的处理略有不同,但在 backend.js 中定义 jquery 依赖项也是一致的。

define(function(require){
  var $ = require('jquery');

  return {
    getCustomers:function(){
      //do some ajax and return a promise
        return $.ajax({
          url: 'http://graph.facebook.com/facebook?callback=?',
          dataType: 'json',
        }).promise();
    }
  };
});

补充一点:除了上面的 common.js 语法,默认的 AMD 语法也经常在 Durandal 应用程序中使用。两者都是等价的,这是个人风格的问题。

define(['backend', 'knockout'], function (backend, ko) {

 return {
    customer:ko.observable(),
    activate:function(){
      var that = this;
      return backend.getCustomers().then(function(result){
        that.customer(result);
      });
    }
  };
});
于 2013-10-31T08:11:40.140 回答