【问题标题】:Binding a property to modelview function in knockout在淘汰赛中将属性绑定到模型视图函数
【发布时间】:2013-01-08 18:58:46
【问题描述】:

我有:

userAccess对象:

var userAccess = new (
  function() {
      this.userLogedIn = false;
  }
);

我有模型视图,绑定到 UI

var modelview = new (
  function(){             

     this.itemVisible = 
       function(data) {
           if(data.id === "ID2")
             return userAccess.userLogedIn;

            return true;
       };     

    this.items = [{id:"ID1", text:"text1"}, {id:"ID2", text:"text2"}];
  }
);

在 UI 上,foreach 绑定我有:

<span data-bind="text: text, visible:$parent.itemVisible($data)"> </span>

所以span 元素的可见性 绑定到modelview 的函数。

该函数根据其IDuserAccess 的值确定当前 项的可见性。

问题:

双向绑定在这种情况下不起作用。例如,如果我使userAccess.userLogedIn = true 元素“ID2”不可见。

这是因为缺少observable,但在我看来,我无法适应这种模式的可观察对象。

我也知道我可以手动更新绑定,但如果可能的话,我想避免这种情况。

我觉得我在这里遗漏了一些明显的东西。

Complete source on CodePen

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    您可能应该重构整个设置以使用可观察对象。否则,由于缺少自动视图更新(如您所见),使用敲除没有多大意义。

    var userAccess = new (
        function() {
            // It is likely that this value will change, so make it an observable!
            this.userLogedIn = ko.observable(false);
        }
    );
    
    // Create a "class" for the items in the list be able to encapsulate behavior /
    // properties such as "is this item visible"?
    var Item = function(id, text) {
        var self = this;
    
        self.id = id; // <-- will most likely never change (?) => not an observable
        self.text = ko.observable(text);
    
        // Use a "computed observable" for things that require more sophisticated logic
        self.visible = ko.computed(function() {
            if (self.id === "ID2") {
                return userAccess.userLogedIn(); // <-- observable = () required!
            } else {
                return true;
            }
        });
    };
    
    var modelview = new (
        function() {             
            this.items = ko.observableArray([
                new Item("ID1", "text1"), new Item("ID2", "text2")
            ]);
        }
    );
    

    在 HTML 中

    <span data-bind="text: text, visible: visible"> </span>
    

    示例:http://jsfiddle.net/a89VL/

    【讨论】:

    • 啊,好的。我不明白你的意思。在实践中,您将模型视图细化为更详细的部分:因此模型视图包含项目(自我描述)对象的集合。会试试的,谢谢。!
    • 确切地说,将属于某个项目的事物捆绑到该项目的“类”中通常是个好主意,而不是将所有内容直接放入视图模型中。这样,每个项目都可以有计算属性等。你最终会得到更简洁的代码!
    • 很酷,我通过将可见性管理器功能留在模型视图的外部 来管理它,并且效果也很好。 codepen example.Thx !
    • Niko,“类”也是一个 ViewModel ;) ItemViewModel 因此是一个更好的名字
    猜你喜欢
    • 2014-09-07
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多