【问题标题】:Knockout how do I set value in child observable淘汰赛我如何设置子可观察值
【发布时间】:2016-07-14 03:27:56
【问题描述】:

我正在尝试使用模板实现内联编辑。在我的视图模型上,我有一个方法:self.changeMode。我是从按钮单击事件(在模板内)触发的。传递给 changeMode 函数的 data 参数包含的是预期数据,但我需要更改 observable。我该怎么做?

var MyViewModel = function (data) {
    var self = this;

    self.managingAgentId = ko.observable(data.managingAgentId);
    self.companyName = ko.observable(data.companyName);
    self.companyNumber = ko.observable(data.companyNumber);
    self.isActive = ko.observable(data.isActive);
    self.agents = ko.observableArray(data.agents);
    
    // Change to Edit or Display mode
    self.changeMode = function (data,event) {
        event.preventDefault();
        // => need to change mode here!
    };
}


$(function () {

        $.ajax({
            type: "GET",
            url: ma.Urls.LoadManagingAgent
        }).done(function (result) {
            $.each(result.agents, function (index, element) {
                element.mode = "display";
            });
            
            ko.applyBindings(new MyViewModel(result));
        }).error(function (response) {
            addMessage(response);
        });
    });
<script type="text/html" id="display">
    <td data-bind="text: managingAgentMemberId"></td>
    <td data-bind="text: applicationUser.userName"></td>
    <td data-bind="text: applicationUser.email"></td>
    <td data-bind="text: applicationUser.emailConfirmed"></td>
    <td data-bind="text: isActive"></td>
    <td>
        <button class="btn btn-success btn-sm" data-bind="click:$root.changeMode">
            <i class="fa fa-edit"></i>
            Edit
        </button>
    </td>
</script>

<script type="text/html" id="edit">
    <td data-bind="text: managingAgentMemberId"></td>
    <td data-bind="text: applicationUser.userName"></td>
    <td data-bind="text: applicationUser.email"></td>
    <td data-bind="text: applicationUser.emailConfirmed"></td>
    <td><input type="checkbox" data-bind="checked: isActive" /> </td>
    <td>
        <button class="btn btn-success btn-sm kout-update">
            <i class="fa fa-save"></i>
            Update
        </button>
        <button class="btn btn-danger btn-sm kout-cancel">
            <i class="fa fa-stop"></i>
            Cancel
        </button>
    </td>
</script>

【问题讨论】:

  • 不确定我理解你的意思。正在返回的 ajax 上调用 applyBindings?
  • 我在写完评论大约 5 秒后删除了评论,在您看到删除之前似乎有一些延迟。
  • 你想把mode改成什么?此外,mode 在您的视图模型中甚至不是可观察的。
  • 我有 2 个值被传递给模板 - 编辑和显示。因此,当单击按钮(在代理行上)时,我想将“显示”值更改为“编辑”,这有望将行更改为使用编辑模板。还有一个名为“edit”的模板
  • OK - 所以设置 observableArray([data.agents]) 不使用 Ajax 调用后设置的“mode”属性?那么,如何将其作为新属性添加到每个代理上?

标签: knockout.js knockout-2.0 knockout-mapping-plugin knockout-mvc


【解决方案1】:

规范解决方案:

function Child(data) {
    var self = this;
    self.name = ko.observable();
    self.mode = ko.observable('display');
    ko.mapping.fromJS(data, Child.mapping, self);
}
Child.prototype.toggleMode = function () {
    this.mode(this.mode() === 'display' ? 'edit' : 'display');
};
Child.mapping = {
    // mapping rules, if applicable
};
function Parent(data) {
    var self = this;
    self.children = ko.observableArray();
    ko.mapping.fromJS(data, Parent.mapping, self);
}
Parent.mapping = {
    children: {
        create: function (options) {
            return new Child(options.data);
        }
    }
};

ko.applyBindings(new Parent({
    children: [
        {name: 'Child 1'}, {name: 'Child 2'}, {name: 'Child 3'}
    ]
}));
td:first-child {
    width: 200px;
}
button {
    width: 6em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js"></script>

<table>
    <tbody data-bind="foreach: children">
        <tr data-bind="template: mode"></tr>
    </tbody>
</table>

<script type="text/html" id="display">
    <td data-bind="text: name"></td>
    <td>
        <button data-bind="click: toggleMode">Edit</button>
    </td>
</script>

<script type="text/html" id="edit">
    <td><input data-bind="value: name"></td>
    <td>
        <button data-bind="click: toggleMode">Save</button>
    </td>
</script>

【讨论】:

  • 接受但不赞成?并不是说我会依赖它,但我想知道这背后的基本原理是什么。
  • 只是想把你的逻辑插入我的场景中——现在投票
  • 你误会我的意思了,我并不是在寻求支持,而是寻求解释。我已经不止一次看到了,假设“upvote”意味着“很有帮助”,我无法理解“accepting w/o upvote”应该传达的信息。
  • 我的理解是有问题的人接受答案,其他阅读帖子并觉得有帮助的人点赞 - ??
  • 经典新手错误与淘汰赛 - 我没有在 mode => this.mode(this.mode === 'display' ? 'edit' : 'display');那永远行不通
猜你喜欢
  • 2018-03-30
  • 2015-10-05
  • 2020-11-20
  • 2023-03-11
  • 2014-11-05
  • 2012-09-08
  • 2012-07-07
  • 2015-01-25
相关资源
最近更新 更多