2017-02-17 5 views
0

В моем файле машинописных файлов я пытаюсь иметь наблюдаемый класс, который содержит все мои связанные с UI поля, которые я могу получить и отправить на сервер. У меня есть это outisde моей модели просмотра, так как я хочу отделить поля, которые я отправляю, ко всем другим элементам модели представления.TypeScript, нокаут и классы

Итак, в моем файле машинописных файлов я сначала создаю модель своего пользовательского интерфейса.

interface Model { 
    id: KnockoutObservable<number>; 
} 


class MyViewModel { 

    model: KnockoutObservable<Model>; 

    constructor() { 

    $.get("/api/debt/1") 
     .done((data) => { 
      this.model().id(data.ID); 
     }); 
    } 

} 

Это не работает. По какой-то причине «this.model» неизвестен.

Является ли то, что я пытаюсь сделать даже возможным? Что я делаю не так?

Редактировать: Упрощено просто использовать свойство id. Использование интерфейса, а не класса. Ошибка в этом.model(). Id (data.ID), поскольку «режим не является функцией»). Не уверен, как инициализировать модель сейчас.

ответ

3

Вы определили, какая модель должна быть, ее объект типа «KnockoutObservable», но вы на самом деле ничего не создали для заполнения переменной, поэтому ее значение все еще не определено.

Попробуйте заменить model: KnockoutObservable<Model>; с

model: KnockoutObservable<Model> = ko.observable(new Model()); 

EDIT 1:

Кроме того, вы хотите, чтобы изменить ваши задания ниже, чтобы рассмотреть свойства Unboxed модели вместо самого наблюдаемого при добавлении скобки:

this.model().id = ko.observable(0); 
    this.model().description = ko.observable(""); 
    this.model().openingBalance = ko.observable(0); 
    this.model().standardRate = ko.observable(0); 

EDIT 2:

TypScript сохранит контекст «this», если вы используете выражение лямбда для вашего обратного вызова вместо объявления стандартной функции.

$.get("/api/debt/1") 
     .done((data) => { 
      this.model().id(data.ID); 
     }); 

Вы, вероятно, также необходимо присвоить новое значение для существующего экземпляра вашего «ид» наблюдаемые, а не замена наблюдаемых. Отслеживание зависимостей нокаута не работает, если вы перезаписываете наблюдаемые, к которым привязана привязка. Таким образом, вы используете наблюдаемую функцию как функцию вместо использования оператора присваивания (=).

EDIT 3:

Вот более полный пример:

class Model { 
    id: KnockoutObservable<number>; 
} 


class MyViewModel { 

    model: KnockoutObservable<Model> = ko.observable(new Model()); 

    constructor() { 

     this.model().id = ko.observable(0); 

     $.get("/api/debt/1") 
     .done((data) => { 
      this.model().id(data.ID); 
     }); 
    } 

} 
+0

Спасибо за это! В моем .done, после того, как я получаю, это правильный способ назначить? Я внес изменения, которые вы сказали, но в задании он говорит мне, что «TypeError: this.model не является функцией». Кроме того, можно наблюдать наблюдаемую модель? Я хочу, чтобы свойства были видимыми. Может быть, это тоже ошибка? – Craig

+1

Я думаю, проблема там может быть в том, что «это» больше не относится к классу и вместо этого относится к функции обратного вызова .done. Javascript это странно. Если вы измените свою .done-функцию на выражение лямбда, вместо этого машинопись будет автоматически переносить «этот» контекст. –

+1

Обновлен мой ответ на примере лямбды. Дайте мне знать, если вам нужно больше объяснений. –

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