【问题标题】:Visibility not being updated on property change KnockoutJs属性更改 KnockoutJs 未更新可见性
【发布时间】:2014-04-23 13:17:47
【问题描述】:

我在过去 3 小时内搜索互联网寻找解决方案,但一无所获。我找到的最接近我正在寻找的东西在这里:Is it possible to data-bind visible to the negation ("!") of a boolean ViewModel property?。而且我无法让这个解决方案发挥作用。

我正在尝试基于视图模型的 childlistitem 的属性隐藏 dom 元素。

    function ViewModel() {
        var self = this;

        this.addSocialMediaLink = function () {
            self.EditProjectSocialMediaViewModels.push({ ProjectId: 0, ProjectSocialMediaId: 0, SocialMediaType: '', Url: '', Deleted: false });

        }.bind(this);

        self.removeSocialMediaLink = function (socialLink) {
            socialLink.Deleted = true;
        }
    }

    $(function () {
        ko.bindingHandlers.hidden = {
            update: function (element, valueAccessor) {
                ko.bindingHandlers.visible.update(element, function () {
                    return !ko.utils.unwrapObservable(valueAccessor());
                });
            }
        };

        var myViewModel = new ViewModel();
        $.getJSON('@Url.Action("GetProject")' + '/ProjectId', null, function (data) {
            ko.mapping.fromJS(data, {}, myViewModel);
            ko.applyBindings(myViewModel);
        });
    });

服务器端虚拟机

public class EditProjectSocialMediaViewModel
{
    public int ProjectId { get; set; }

    public int ProjectSocialMediaId { get; set; }

    [Required]
    [Url]
    [StringLength(100, ErrorMessage = "The {0} must be no longer than 100 characters.")]
    public string Url { get; set; }

    public bool Deleted { get; set; }
}

Dom:

<div data-bind='foreach: EditProjectSocialMediaViewModels'>
    <input type="text" class='required form-control' data-bind='value: Url, hidden: Deleted, attr: { name: "EditProjectSocialMediaViewModels["+$index()+"].Url" }' />
    <a href="#" data-bind="click: $root.removeSocialMediaLink">Delete</a>
    <br />
</div>
<button data-bind='click: addSocialMediaLink'>Add Social Media Link</button>

单击链接时,值会更改并正确存储。但可见性不会改变。

【问题讨论】:

    标签: c# asp.net-mvc knockout.js


    【解决方案1】:

    可见性没有改变,因为已删除的属性不可观察,使其可观察。

    function ViewModel() {
     var self = this;
     self.EditProjectSocialMediaViewModels = ko.observableArray([]);
     this.addSocialMediaLink = function () {
         self.EditProjectSocialMediaViewModels.push({
             ProjectId: 0,
             ProjectSocialMediaId: 0,
             SocialMediaType: '',
             Url: '',
             Deleted: ko.observable(false)
         });
    
     }.bind(this);
    
     self.removeSocialMediaLink = function (socialLink) {
         socialLink.Deleted(true);
     }
    }
    

    http://jsfiddle.net/U8j5G/

    【讨论】:

    • 我的视图模型从服务器初始加载时会怎样。如何在无需完全重新定义 javascript 中的 viewmodel 类的情况下将 observable(false/true) 添加到其中。最初加载时,javascript 和淘汰赛将 Deleted 识别为布尔值,并在最初加载来自淘汰赛的隐藏/可见绑定。如果我尝试将已删除更改为 ko.observable(true)。获取有关已删除的错误是布尔而不是函数。
    • ko.mapping.fromJS 默认将每个属性转换为 observable,因此您无需担心。 :)
    • 使用 ko.mapping 绑定数据没问题。
    • 我就是这么想的。但是当我对其中一条记录调用删除函数时,我的初始数据来自服务器,并且更新值的可见性没有改变。 ` self.removeSocialMediaLink = function (socialLink) { socialLink.Deleted = true; }`
    • socialLink.Deleted(true) 像这样调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 2020-02-10
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多