2015-08-05 3 views
0

В проекте ASP.NET 5 с Visual Studio 2015 мы используем классы Postscript с Knockout для генерации наших файлов Javascript. Мы используем AMD и ES5. Предположим, у нас есть этот первый класс:Импортируйте модуль и используйте его в поле зрения

ActionViewModel.ts

export class ActionViewModel { 
    public Id: KnockoutObservable<number>; 
    ... 
} 

И еще один класс, который реализует ActionViewModel в другом файле машинопись.

action.ts

import { ActionViewModel } from 'ActionViewModel'; 

class ActionVM extends ActionViewModel { 
    ... 
} 

class ActionViewModelManager { 
    private actionViewModel: ActionVM; 
    ... 
} 

ActionViewModelManager используется для управления ViewModel. Мы загружаем первый ViewModel с помощью ключевого слова import.

Проблема

Javascript файл, созданный использовать определить() метод для загрузки файла ActionViewModel.ts.

define(["require", "exports", 'ActionViewModel'], function (require, exports, ActionViewModel) { 
    var ActionVM = (function (_super) { 
    } 

    var ActionViewModelManager = (function() { 
     function ActionViewModelManager(withValidationRules) { 
      this.actionViewModel = new ActionVM(); 
      ko.applyBindings(this.actionViewModel); 
     } 
     ... 
    } 
}); 

Но если я хочу использовать ActionViewModelManager в представлении (Index.cshtml)

<script> 
     $(function() { 
      var actionViewModelManager = new ActionViewModelManager(); 
     }); 
</script> 

я не могу, потому что он сказал, что ActionViewModelManager не доступен: это под сферу метода обратного вызова о определить метод. Поэтому мой вопрос: как мы можем использовать класс, объявленный в файле, где мы импортируем другой класс?

Edit: все JS генерироваться

var __extends = (this && this.__extends) || function (d, b) { 
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; 
    function __() { this.constructor = d; } 
    __.prototype = b.prototype; 
    d.prototype = new __(); 
}; 
define(["require", "exports", 'ActionViewModel'], function (require, exports, ActionViewModel) { 
    var ActionVM = (function (_super) { 
     __extends(ActionVM, _super); 
     function ActionVM() { 
      var _this = this; 
      _super.call(this); 

      this.clientSelected = function (args, handler) { 
      ... 
      }; 
      this.offreSelected = function (args, handler) { 
      ... 
      }; 
      this.submitAction = function (formElement) { 
      ... 
      }; 
     } 

     return ActionVM; 
    })(ActionViewModel); 

    var ActionViewModelManager = (function() { 
     function ActionViewModelManager(withValidationRules) { 
      this.actionViewModel = new ActionVM(); 
      ko.applyBindings(this.actionViewModel); 
     } 

     ActionViewModelManager.prototype.SetId = function (valeur) { this.actionViewModel.Id(valeur); }; 
     ActionViewModelManager.prototype.SetDescription = function (valeur) { this.actionViewModel.Description(valeur); }; 

     return ActionViewModelManager; 
    })(); 
}); 

я уменьшил содержание файла, чтобы быть более удобным для чтения.

+0

Есть ли еще сгенерированный Javascript, который вы можете поделиться и/или изменить свой результат? – WhiteHat

+0

Спасибо за ваш ответ, см. В редакции –

+0

этой помощи _might_. Вы должны знать, к чему относится этот термин, какой-то родительский класс или пространство имен. если бы вы знали, что можете использовать 'namesp.AVM' и т. д. Или после ответа здесь вы можете быть уверены. http://stackoverflow.com/questions/16595220/extends-in-javascript – WhiteHat

ответ

0

Для

<script> 
     $(function() { 
      var actionViewModelManager = new ActionViewModelManager(); 
     }); 
</script> 

Поскольку вы используете АМД (я предполагаю, requirejs), вы можете сделать:

<script> 
     $(function() { 
      require(['/path/to/actionvmfile'],function(res){ 
       var actionViewModelManager = new res.ActionViewModelManager(); 
      } 
     }); 
</script> 

Примечание: конечно, вы должны экспорт класс для этой работы т.е. export class ActionViewModelManager

+0

Спасибо за ваш ответ, это помогло. Но я встречаю новую ошибку: 'Ошибка выполнения JavaScript: Ошибка скрипта для: ActionViewModel'. Кажется, что RequireJS не может загрузить ActionViewModel.js here: 'define ([" require "," export "," ActionViewModel "]' –

+0

Использовать './ActiveViewModel' – basarat

+0

Я нашел решение довольно простым, и это позволило мне загрузить файлы Javascript, которые мне нужны на моей странице: https://jsfiddle.net/x6Ljtf5m/, но я нашел путь baseUrl уродливым –