/ / Použitie ScriptSharp s Knockout.Mapping cez RequireJS - requirejs, knockout-mapping-plugin, script #

Použitie skriptu ScriptSharp s Knockout.Mapping cez RequireJS - requirejs, knockout-mapping-plugin, script #

Snažím sa pracovať so všetkými účtami Script # Závislosť.

Mám projekt Script # odkazujúci na knockout knižnicu. Ktoré som po uplynutí určitého času pracoval s Requiem.

Teraz by som rád použil mapovanie KnockoutJS, ktoré vyhovuje niečomu

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

Avšak ko.mapping nie je definovaný.

Ak manuálne (len na testovanie) zmením kompilovaný súbor .js tak, aby zahŕňal mapovanie takto:

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

"mapovanie" je definované, ale nie ako "ko.mapping", čo je spôsob, akým to kompilátor odkazuje.

Nejaké nápady?

Toto je moja konfigurácia:

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"]
}
});

odpovede:

3 pre odpoveď č. 1

Znie to ako Script # to predpokladá ko a ko.mapping sú v globálnom mennom priestore a nie sú načítané ako AMD. Ale, Knockout a Knockout.mapping sú kódované tak, že keď zistia AMD / RequireJS, nepoužívajú globálny priestor názvov.

Niekoľko možností, ako to vyriešiť:

1 - vstreknite ho hneď, ako sa volá request.config (na základe nižšie uvedených pripomienok), než čakať na niečo, čo skutočne požaduje vyradenie alebo knockout.mapping

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

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

2 - vytvorte si vlastný baliaci modul aby ste ju vniesli späť do globálneho prostredia. Niečo také:

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
});

Potom môžete vytvoriť konfiguráciu mapy RequireJS tak, aby ste vždy, keď požiadali o "knockout" alebo "knockout.mapping", dostali transparentne premenené na vyššie uvedené balíky.

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 pre odpoveď č. 2

Táto vzorka (https://github.com/nikhilk/scriptsharp/tree/cc/samples/KOWorld) zobrazuje pomocou skriptu # + knockout spolu s požiadavkami ako nakladač AMD.

Uistite sa, že šablóna skriptov v AssemblyInfo.js uvidíte, aby ste túto prácu vykonali.

Dúfajme, že to pomôže a pracuje.