2013-07-10 2 views
1

Я борюсь со всей загрузкой сценария # Зависимость.Использование ScriptSharp с Knockout.Mapping через RequireJS

У меня есть сценарий # Проект, ссылающийся на библиотеку нокаутов. Который я должен работать после некоторого времени с RequireJS.

Теперь я хотел бы использовать KnockoutJS отображение, которое согласовывалось бы что-то вроде

var model = ko.mapping.fromJS(data, {}, new ViewModel()); 

Однако ko.mapping не определено.

Если я вручную (только для тестирования) изменить скомпилированный файл .js включить отображение как это:

define('MyApp', 
    ['ss', 'jquery', 'knockout', knockout.mapping], 
    function (ss, $, ko, mapping) { /*...*/ } 
); 

«отображение» определяется, но не как «ko.mapping», который, как компилятор ссылается на него.

Любые идеи?

Это мой конфиг:

requirejs.config({ 
    paths: { 
     'jquery': 'jquery-1.9.1', 
     'jqueryValidation': 'jquery.validate', 
     'knockout': 'knockout-2.2.0', 
     'knockout.mapping': 'knockout.mapping-latest.debug', 
     'modernizr': 'modernizr-2.6.2' 
    }, 
    shim: { 
     'jqueryValidation': ['jquery'], 
     'jquery.validate.unobtrusive': ['jquery', 'jqueryValidation'], 
     'jquery.unobtrusive-ajax': ['jquery'], 
     'knockout.mapping': ['knockout'] 
    } 
}); 
+0

, пожалуйста, также разместите раздел require.config – explunit

+0

^добавлен мой конфиг – Sam7

ответ

3

Это звучит как Script # предполагает, что ko и ko.mapping находятся в глобальном пространстве имен, не загружен как AMD. НО, Knockout и Knockout.mapping кодируются таким образом, что при обнаружении AMD/RequireJS они не используют глобальное пространство имен.

Пару вариантов обойти это:

1 - INJECT сразу после require.config называется (на основе комментариев ниже), а не ожидая чего-то на самом деле просить нокаута или knockout.mapping

requirejs.config({ 
    // same as original 
}); 

require(["knockout", "knockout.mapping"], function (ko, m) {  
    ko.mapping = m; 
}) 

2 - создайте свой собственный модуль обертки, чтобы ввести его обратно в глобальный. Что-то вроде этого:

define('knockout.inject', ['knockout'], function(k) 
{ 
    window.ko = k; // make a ko global 
    return k; // but also return what a normal AMD require expects 
}); 

define('knockout.mapping.inject', ['knockout.mapping'], function(m) 
{ 
    window.ko.mapping = m; // make a ko.mapping global 
    return m; // but also return what a normal AMD require expects 
}); 

ТОГДА, вы можете сделать конфигурацию карты RequireJS так, что всякий раз, когда вы запрашиваете «нокаут» или «knockout.mapping», они получают прозрачно переназначены на ваши выше обертки.

requirejs.config({ 
    paths: { // same as original }, 
    shim: { // same as original }, 
    map: { 
     '*': { 
     'knockout': 'knockout.inject', 
     'knockout.mapping': 'knockout.mapping.inject' 
     }, 
     // prevent cycles 
     'knockout.inject': {'knockout': 'knockout'}, 
     'knockout.mapping.inject': {'knockout.mapping': 'knockout.mapping'} 
    } 
}); 
+0

Спасибо. перспективный ... но [window.ko.mapping = m;] никогда не вызывается. И никаких исключений не бросают. Есть идеи? – Sam7

+0

@ Sam7 выглядит так, как мой синтаксис был неправильным в разделе 'map'. Попробуйте приведенную выше редакцию. – explunit

+0

спасибо. Я уже пробовал это, но это не так. Я понял, что просто добавление этой строки кода сделает трюк require (["knockout", "knockout.mapping"], function (ko, m) {ko.mapping = m;}); поэтому, если вы хотите настроить ответ, я рад сделать его решением.;) – Sam7

0

В этом примере (https://github.com/nikhilk/scriptsharp/tree/cc/samples/KOWorld) показывает использование сценария # + нокаута наряду с requirejs как загрузчик AMD.

Обязательно просмотрите шаблон сценария в AssemblyInfo.js, чтобы сделать все это.

Надеюсь, это поможет и поможет.

+0

Пожалуйста, обратите внимание на размещение ключевых частей конфигурации здесь, если связанный образец когда-либо превращается во что-то другое. В основном вы предлагаете ссылку на прямой скрипт для нокаута, а не загружать его через RequireJS? – explunit

+0

Спасибо Nik. Я уже подробно изучил образец KOWorld, иначе я бы никогда не получил здесь;) Но в вашем примере не используется сопоставление. Несмотря на то, что .net-оболочка отображает классы/методы сопоставления, она не включает «require» в библиотеку knockout.mapping. – Sam7

Смежные вопросы