1

我在 mvc4 中使用 require js。

看法

<script data-main="/scripts/about" src="/scripts/require.js" ></script>
<article>
<p>
    Use this area to provide additional information.
</p>
</article>

about.js

   require.config({

    paths: {
        page1: '/Scripts/page1',
        page2: '/Scripts/page2',
        knockout : '/Scripts/knockout-2.2.0'
      }

    });

     require(['page1', 'page2','knockout'], function (page1, page2) {

     var car = new page1.Car();
      car.speed(60);

      var cycle = new page2.Cycle();
      cycle.speed(20);



      console.log(car.speed());
     console.log(cycle.speed());
  });

page1.js

    define(function(){

    function Car() {

    var self = this;
    self.speed = ko.observable();

     }

     });

第2页

  define(function () {

  function Cycle() {

    var self = this;
    self.speed = ko.observable();

   }

   });

在控制台中它说Car未定义。

更新

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

   function Car() {

    var self = this;
    self.speed = ko.observable();
    return {
        speed: self.speed() // But don't forget to declare it in the returned object!
       };
     }

  });

我在 page1 和 page2 都这样做了

提前致谢

4

3 回答 3

1

AFAIK requirejs 将加载的库隔离到单个文件。在您的 page1 和 page2 中没有加载淘汰赛,因此ko未定义命名空间,因此ko.observables未定义,当您创建新 Car 时,它将未定义。要解决此问题,您应该在 page1 和 page2 中加载敲除,同时提供ko命名空间作为函数参数:

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

  function Car() {

    var self = this;
    self.speed = ko.observable();

  }

});

或者使用ko = require('knockout');或加载一个用于敲除的 shim 作为全局命名空间

编辑:

至少你试过了。所以这里是跟进。

当您进行定义时,您会为所有视图模型和其他视图模型提供此功能。它是 requirejs 函数,这个函数应该返回一些东西(即你的 viewModel)。这样,您可以在定义的模块中拥有私有和公共变量和函数。

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

  var Car = function () {
    var self = this;
    self.speed = ko.observable();
  }

  return Car;
});

该名称仅对该模块范围很重要。在您的 about.js 中,当您导入模块时,您可以决定如何调用它:

//load page1 script and give returned object 
//(this case a constructor) name: createCar
require(['page1'], function (createCar) {

  // now create new instance of your Car function:
  var car = new createCar();
  car.speed(60);

  console.log(car.speed());
});
于 2013-07-29T09:08:34.293 回答
0

您的模块需要return它们所代表的代码。例如,您的Car模块应如下所示:

define(function(){    
    function Car() {
        var self = this;
        self.speed = ko.observable();
    };    
    return Car;
 });

模块完成后必须表示一些东西,要么是函数(构造对象),要么是对象(表示单例)。一旦你的模块被定义,你require就可以在另一个模块中使用它。

define(['pathtoCar/relativeToDataMainAttribute/fromRequireScriptTag'], 
function(Car){
    var ferrari = new Car();
    ...
 });
于 2013-07-29T17:39:16.230 回答
0

你可以试试这个

 define(function () {

      function Cycle() {

        var self = this;
        self.speed = ko.observable();

       }

    ///////////////////ADDD   THISSSS NEWWWW LINEEEE//////////

    return new cycle();

   });
于 2013-10-12T10:05:49.010 回答