要求js不使用淘汰赛

时间:2013-07-29 06:13:08

标签: knockout.js requirejs

我在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

中都这样做了

提前致谢

3 个答案:

答案 0 :(得分:1)

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

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

  function Car() {

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

  }

});

或使用ko = require('knockout');或将knock的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());
});

答案 1 :(得分: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();
    ...
 });

答案 2 :(得分:0)

你可以试试这个

 define(function () {

      function Cycle() {

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

       }

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

    return new cycle();

   });