【问题标题】:Knockout data-bind syntax in razorrazor 中的敲除数据绑定语法
【发布时间】:2013-11-14 16:04:37
【问题描述】:

在这个简单的 CSS Knockout 绑定中

<tag data-bind="css: { 'class_1': condition1, 'class_2': condition2 }" />

我想将 class_1class_2 移植到 C# 变量。这是我的第一次尝试:

<tag data-bind="css: { '@class1': condition1, '@class2': condition2 }" />

其他尝试导致我不得不声明一个包含绑定语句的单独变量。

string bind = string.Format("'{0}': condition1, '{1}': condition2", class1, class2)
<tag data-bind = "css: { @bind }" />

最后:

string bind = string.Format("css: {{ '{0}': condition1, '{1}': condition2 }}", class1, class2)
<tag data-bind = "@bind" />

这些都不会阻止页面的呈现,但前两个结果在 Visual Studio 中指示语法错误。 我想做这个绑定:

  • 无需分离一个单独的变量
  • Visual Studio 2012(和 搞砸代码崩溃)

有可能吗?

最后一个例子,唯一没有给出语法错误的例子,牺牲了代码的可读性,尤其是对于较大的语句。有没有其他看起来更像我的第一次尝试的选择? Knockout MVC 似乎有点过于侵入性:有没有类似的东西可以解决这个问题?

【问题讨论】:

  • 您打算使用 Knockout 更新 CSS 类还是静态的?
  • 静态的。从客户端的角度来看,类的名称将是静态的。我想 razor 打印这些名字,他正在这样做,但不是没有搞砸 ide 环境。
  • 既然你问我...我可以用 razor 将类名分配给一个 js 变量,然后只使用敲除。可能是一个解决方案...
  • 我也在想,或者你可以改变你的 KO VM 以通过构造函数获取类并将它们分配给属性。
  • 这可能是一个很好的解决方案! KO可以把js变量作为bind语句中的类名吗?

标签: asp.net-mvc visual-studio-2012 razor knockout.js


【解决方案1】:

我的机器上没有安装 VS 2012,但是 VS 2013 的语法高亮接受此代码:

<style>
    .myClass {
        color: red;
    }
</style>

@{
    var MyClass = "myClass";
}

<div id="fooId">
    <span data-bind="css: { '@MyClass': enableClass }, text: myText"></span>
</div>

@section scripts{    
    <script>
        var vm = {
            enableClass: ko.observable(true),
            myText: ko.observable('foobarbaz')
        };
        ko.applyBindings(vm, document.getElementById('fooId'));
    </script>
}

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是这样的:

    class1 = @Model.CssClass1;
    class2 = @Model.CssClass2;
    
    var viewModel = function(class1, class2) {
        self = this;
    
        self.classOne= ko.observable(class1);
        self.classOne= ko.observable(class2);
    
        self.condition_1 = // something
        self.condition_2 = // something
    };
    
    ko.applyBindings(new viewModel (class1, class2));
    

    然后按照您在第一个示例中展示的那样应用绑定:

    <tag data-bind="css: { classOne : condition1, classTwo: condition2 }" />
    

    【讨论】:

    • 我在想:你确定他不会从字面上解释 classOne 吗?我的意思是,通过将类“classOne”或“classTwo”应用于标签?我需要几分钟来设置它:我们很快就会知道。
    • 例如,visual studio 不接受 $root.something 作为类名
    • 你可以在问题中发布你的 KO 视图模型和 html
    • 我做了一个小提琴。使用 $root 是因为在我的代码中我需要在循环中执行此操作。 jsfiddle.net/gjjAC/3
    • 作为一般规则,看起来他不能将类名作为变量引用。 jsfiddle.net/gjjAC/5
    【解决方案3】:

    @Saturnix,既然你说类值只是来自服务器的变量,你可以——而且可能应该——将类变量排除在你的 KO 模型之外。这是我的想法:

    @{ 
    var class1 = Model.condition1 ? 'class1' : '';
    var class2 = Model.condition2 ? 'class2' : '';
    }
    <input data-bind="value: myValue" class="@class1 @class2" />
    

    或者,您可以通过修改视图模型以直接包含类变量来简化视图。如:

    public class MyViewModel
    {
        public bool Condition1 {get; set;}
        public bool Condition2 {get; set;}
        public string Class1 
        {
            get { return Condition1 ? 'class1' : ''; }
        }
        public string Class2
        {
            get { return Condition2 ? 'class2' : ''; }
        }
    }
    
    <input data-bind="value: myValue" class="@Model.Class1 @Model.Class2" />
    

    甚至:

    public class MyViewModel
    {
        public bool Condition1 {get; set;}
        public bool Condition2 {get; set;}
        public string classes 
        {
            get 
            { 
                var classes = new List<string>();
                if (Condition1) classes.Add("class1");
                if (Condition2) classes.Add("class2");
                return string.Join(",", classes);
            }
        }
        public string Class2
        {
            get { return Condition2 ? 'class2' : ''; }
        }
    }
    <input data-bind="value: myValue" class="@Model.classes" />
    

    【讨论】:

    • 他希望类的应用是动态的,这意味着根据满足哪个条件应用不同的类。这就是他具有约束力的原因,您提出的方式是“设置它并忘记它”的解决方案。
    • 是的。我的错。我以为我读到样式应用程序是在服务器端确定的,但我现在看到它是静态类的名称。
    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 2018-11-24
    • 2016-08-22
    相关资源
    最近更新 更多