【问题标题】:Is it possible to set observable in 'click' binding?是否可以在“点击”绑定中设置 observable?
【发布时间】:2013-11-16 02:13:09
【问题描述】:

是否可以在 'click' 绑定中设置 observable?

<div data-bind="click:toolbarBottomTabs_selectedIndex(0)">

其中 toolbarBottomTabs_selectedIndex 是一个 observable。

【问题讨论】:

  • 我很震惊人们如何回答这个问题而不告诉它不好的做法,它很糟糕!糟糕,糟糕,糟糕。 MVVM 的重点是将视图与视图逻辑解耦,以便对其进行测试、重用等。
  • 像 javascript 一样 hacky,除了明显的编码错误之外,我不会担心“不良做法”

标签: mvvm knockout.js


【解决方案1】:

试试这个:

 <div data-bind="click: toolbarBottomTabs_selectedIndex.bind($data, 0)">

【讨论】:

  • 此答案在页面加载时调用该函数。使用.bind是正确的方法。
  • @Cabloo,你错了,页面加载时不会调用函数。但是,使用 bind 更正确,你是对的。
  • @Alexander - 在页面加载时评估 data-bind 属性。在页面加载时评估 bind 函数时,它会返回一个回调,这是应该传递给 click 的回调。您正在传递要作为回调传递的函数的评估版本。
【解决方案2】:

这是可能的,但我认为这不是一个正确的选择:

<div data-bind="click:toolbarBottomTabs_selectedIndex.bind($data, 0)">

Bind 允许以特定值调用您的函数(observable 是一个函数)。 bind 的第一个参数是 this 对象的值,第二个是函数的第一个参数。

【讨论】:

    【解决方案3】:

    编写“click: function(){...}”并不是最好的解决方案。我相信这会更好一些,即使它是多几行代码。

    <div data-bind="click: resetIndex">....</div>
    

    在您的视图模型中定义:

    function resetIndex(){
        toolbarBottomTabs_selectedIndex(0);
    }
    

    【讨论】:

      【解决方案4】:

      我同意Anders 在这个...

      MVVM 的全部意义在于将视图与视图逻辑解耦,以便对其进行测试、重用等。

      以这种方式操作视图模型中包含的数据是可行的,但并不理想。

      <div data-bind="click: function() { toolbarBottomTabs_selectedIndex(0) }">
      

      Knockout 通过unobtrusive event handler 提供了一种更简洁的方式来实现这一点

      在你的例子中,你应该做这样的事情......

      <div id="clickme">...</div>
      

      ...然后在您的 javascript 中包含以下内容

      $('#clickme').on('click', function(e) {
          ko.dataFor(this).toolbarBottomTabs_selectedIndex(0);
      });
      

      【讨论】:

      • 或者只是添加一个在 ViewModel 上做同样事情的函数!? ;)
      • 当然。我选择这种方法是为了可以在这里对特定于 UI 的逻辑进行分组,然后对 ViewModel 进行离散调用。
      • 如果您使用点击绑定,KO 将确保在重新呈现视图时更新(删除、添加项目等)
      • 这是真的。因为我们不能确定还有什么可以操纵这个元素。通过使用 jQuery 的 $.on() 方法来处理单击,对于不显眼的事件处理程序也可以实现相同的目的。我将更新我的示例。
      • 你开始重新发明 KO 轮了 ;) 只需使用点击绑定和你的设置?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2012-02-19
      • 1970-01-01
      • 2021-11-23
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多