Knockout JS Observable Array и модель привязки

1

Я пытаюсь научиться использовать нокаут и еще не найти простой пример того, чего я пытаюсь достичь. Я просто хочу связать List внутри моего класса модели mvc с моим viewModel для нокаута. Например, если у меня есть модель ниже... это один файл класса.

public class PropaneMaintModel
{
   public List<PropaneMaintAssignment> PropaneMaint{get;set;}
   public List<string> LocationIds { get; set; }
   public int? SelectedLocation { get; set; }
}

public class PropaneMaintAssignment
{
    public int StoreNumber { get; set; }
    public int Tanks { get; set; }

    [Required(ErrorMessage="Tank Size must have a value")]
    [Range(0,10000,ErrorMessage="Tank Size must be between 0 and 10000.")]
    public int TankSize { get; set; }
}

Как получить список "PropaneMaint" для работы с привязкой к нокауту? Мне нужно добавить/удалить из списка, например, примеры на сайте нокаутов. Моя модель просмотра определяется ниже, но она не работает.

 function propaneMaintViewModel() {
    var viewModel = this;

    viewModel.PropaneMaint = ko.observableArray([]);
    viewModel.addNew = function () {
        viewModel.PropaneMaint.push(
            {
                StoreNumber: 0,
                Tanks: 0,
                TankSize: 0
            }
       );
    }
}

ko.applyBindings(new propaneMaintViewModel());
  • 0
    Вы создаете новый экземпляр propaneMaintViewModel где-нибудь? Вызов ko.applyBindings(propaneMaintViewModel()); выглядит неправильно. Вы должны либо создать propaneMaintViewModel другом месте и использовать его в ko.applyBindings либо вызвать ko.applyBindings(new propaneMaintViewModel()); ,
  • 0
    Я нет, но я согласен просто добавить «новый» для параметра. Что касается разметки страницы, я просто делаю бритву для каждого цикла с некоторыми кнопками. Я видел пример нокаута foreach, но он не работал со списком, который заполнялся из модели.
Теги:
knockout.js
asp.net-mvc-4
knockout-mvc

1 ответ

0
Лучший ответ

Нокаут не имеет прямого связывания с какой-либо моделью С#. Что вы можете сделать, это сериализовать вашу модель MVC для объекта json, а затем связать ее. IE:

function bindModels(arr) {
    var propaneMaintAssignments = new Array();
    for (var i = 0; i < arr.length; i++)
        propaneMaintAssignments.push(new PropaneMaintAssignment(arr[i]));
    return propaneMaintAssignments;
}

function PropaneMaintAssignment(model) {
    for(var property in model)
       this[property] = model[property];  //bind all properties
}

var json = @Html.Raw(new JavaScriptSerializer().Serialize(Model.PropaneMaint)); //results in an array
var list = bindModel(json);  //makes an array of named objects
viewModel.PropaneMaint(list);  //adds that array of named objects to your observableArray
  • 0
    хммм интересно, и это имеет смысл с комментариями, объясняющими каждый шаг .. я действительно задаюсь вопросом, почему примеры нокаута используют data-bind = "foreach: list"? К какому контексту это относится и почему это не сработает?
  • 0
    Я только что заметил, что вы используете KnockoutMVC; Я не совсем знаком с этой библиотекой, так как я просто использую base knockout.js и mvc. Привязка foreach что-то делает для каждого значения в массиве. В этой скрипте показан пример: список jsfiddle.net/LkqTU/19585 в этом примере должен быть просто именем свойства viewmodel для итерации.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню