简体   繁体   中英

Undefined property knockout.js + mvc

I have a masterDetails view that I populate with some data from a db (it populates fine). I added a button to the master details view, to add a step to my workflow.

My Viewmodel:

/// <reference path="_references.js" />
var viewModel = function (data) {
    var self = this;
    self.SelectedWorkflow = ko.observable({
        Steps: ko.observableArray([]),
        Name: ko.observable("")
    });
    self.Workflows = ko.observableArray(data);

    self.addStep = function() {

        self.Steps.push(new Step(SelectedWorkflow, "Assignment here", "01/01/2014", "dd:mm:ss", "mail"));
    };
};

function Step(workflow,assignment, enddate, reminder, mailaddresses, type) {
    var self = this;
    self.Workflow = workflow;
    self.StepNumber = 0;
    self.Assignment = assignment;
    self.Enddate = enddate;
    self.Reminder = reminder;
    self.MailAddresses = mailaddresses;
    self.Type = type;

};
/// <reference path="workflowdetails-vm.js" />
$(document).ready(function () {
    $.ajax({
        url: "/WorkflowDetails/Index/",
        type: "POST",
        data: {},
        success: function (data) {
            var workflowlist = ko.mapping.fromJS(data.Workflows);
            vm = new viewModel(workflowlist);
            ko.applyBindings(vm);
        }
    });
    $(".right-aligned-section").hide();
});
$(document).delegate(".show-details", "click", function () {
    $(".right-aligned-section").fadeIn();
    var workflow = ko.dataFor(this);
    vm.SelectedWorkflow(workflow);
});

My View:

<div class="left-aligned-section">
    <ul data-bind="foreach: Workflows()">
        <li>
            <div class="workflow-item-border">
                <div>
                    <label data-bind="text: Name"></label>
                </div>
                <div>
                    <label data-bind="text: StartDate"></label>
                </div>
                <div>
                    <a href="#" class="show-details">Show Details</a>
                </div>
            </div>
        </li>
    </ul>
</div> 

<div class="right-aligned-section" data-bind="with: SelectedWorkflow">
    <div class="steps-header">
        <div class="left-aligned-div"><strong>Steps for&nbsp;</strong></div>
        <div class="left-aligned-div" data-bind="text: Name"></div>
    </div>
    <button data-bind="click: addStep">add step</button>
    <ul data-bind="foreach: Steps">
        <li>

            <div class="step-item-border">
                <div>
                    <div class="step-label">Stepnumber: </div>
                    <div style="font-weight: bold" data-bind="text: StepNumber"></div>
                </div>
                <div>
                    <div class="step-label">Assignment: </div>
                    <div style="font-weight: bold" data-bind="text: Assignment"></div>
                </div>
                <div>
                    <div class="step-label">Mails: </div>
                    <div style="font-weight: bold" data-bind="text: MailAddresses"></div>
                </div>
                <div>
                    <div class="step-label">End Date: </div>
                    <div style="font-weight: bold" data-bind="text: Enddate"></div>
                </div>
                <div>
                    <div class="step-label">Type: </div>
                    <div style="font-weight: bold" data-bind="text: Type"></div>
                </div>
            </div>
        </li>
    </ul>
</div> 

When I press the button - nothing happens. The error I receive is:

ReferenceError: Steps is not defined

I know what it means, but I'm not proficient enough in web development to actually fix it. Please help.

Looks like you forgot a this before the Steps.push....

Edit: I have made some further changes to the click handler function

var viewModel = function (data) {
    this.SelectedWorkflow = ko.observable({
        Steps: ko.observableArray([]),
        Name: ko.observable("")
    });
    this.Workflows = ko.observableArray(data);

    this.addStep = function (selectedWorkflow) { // the current context is passed in from the click data-bind

        selectedWorkflow.Steps.push(new Step(selectedWorkflow, "Assignment here", "01/01/2014", "dd:mm:ss", "mail"));
    }
}

Edit: Fixed code

Probably this would work:

var viewModel = {};

viewModel.SelectedWorkflow = {
    Steps: ko.observableArray([]),
    Name: ko.observable("")
};

viewModel.Workflows = ko.observableArray(data);

viewModel.addStep = function () {
    viewModel.SelectedWorkflow.Steps.push(
        new Step(SelectedWorkflow, "Assignment here", "01/01/2014", "dd:mm:ss", "mail"));
    }
}

You have forgotten about SelectedWorkflow.Steps I think...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM