2013-05-15 4 views
6

У меня есть модель просмотра, которая использует пользовательскую функцию наблюдаемого массива для сортировки. Когда я пытаюсь запустить это, он говорит: «... не имеет методов sortByProperty».Как загрузить пользовательские функции KnockoutJS с RequireJS?

Как загрузить файл handlers.js, чтобы сделать эту работу?

handlers.js:

define(['knockout'], function(ko) { 
     'use strict'; 

     ko.observableArray.fn.sortByProperty = function (prop, order) { 
      this.sort(function (obj1, obj2) { 
       var result; 
       if (obj1[prop] == obj2[prop]) 
        result = 0; 
       else if (obj1[prop] < obj2[prop]) 
        result = -1; 
       else 
        result = 1; 

       return order === "desc" ? -result : result; 
      }); 
     }; 

    }); 

viewmodel.js:

define([ 
     'knockout', 
     'js/extends/handlers' 
    ], function(ko) { 
     'use strict'; 

     var LabelsModel = function() { 
      var self = this; 

      self.availableLabels = ko.observableArray(); 
      self.selectedLabel = ko.observable(); 
      self.sortBy = ko.observable(); // What field to sort by 
      self.sortOrder = ko.observable(); // Sort order. asc or desc. 

      // Returns the labels for the current page 
      self.pagedRows = ko.computed(function() { 
       // Sorts the labels 
       return self.availableLabels.sortByProperty(self.sortBy(), self.sortOrder()); 
      }); 

     }; 

     return LabelsModel; 

    }); 

ответ

1

Вы должны сначала убедиться, что KnockoutJS определяются, а затем загрузить плагин, и, наконец, запустить приложение , Я думаю, что все плагины для библиотек должны быть загружены. Вот как вы можете это сделать:

require.config({ 
     paths: { 
     jquery: 'libs/jquery-1.9.0.min', 
     ko: 'libs/knockout-2.2.1.min' 
    } 
}); 

require(['jquery', 'ko'], 
    function($, ko) { 
     // ensure KO is in the global namespace ('this') 
     if (!this.ko) { 
      this.ko = ko; 
     }; 

     requirejs(['handlers'], 
      function() { 
       require(['app'], 
        function(App) { 
         App.initialize(); 
        } 
       ); 
      } 
     ); 
    } 
); 

У меня было намного больше библиотек, поэтому я срубил его немного только для JQuery и KnockoutJS, но в основном вы:

  1. заявляют, где ваши библиотеки
  2. необходимо загрузить их
  3. необходимо загрузить плагины для ваших библиотек, здесь обработчики для KnockoutJS
  4. загрузите ваше приложение (удобно названное ... «приложение» здесь :-). Здесь вы должны инициализировать свои модели просмотра и привязать их к элементам DOM. Скорее всего, это то место, где загружены все библиотеки и плагины.
+0

Спасибо. Загрузка его с помощью requirejs сделала трюк. – Sindre

+0

@Sindre приятно! Спасибо и удачи! – Jalayn

+0

Вам не нужно делать его глобальным для вашего конкретного сценария. Кажется, что ваш оригинальный образец должен работать правильно. Именно так я загружаю расширения. –