【问题标题】:Knockout, Require, Sammy and a view model for each page – how do I make it work?Knockout、Require、Sammy 和每个页面的视图模型——我如何使它工作?
【发布时间】:2013-07-20 04:40:18
【问题描述】:

我有一个 KO 应用程序,我的每个页面都有一个单独的视图模型来处理该页面上所需的所有操作(加载、添加、编辑、删除等)。我已经设法使用 RequireJS 将代码拆分为多个模块,但我找不到使用 Sammy 让多个视图模型同时工作的方法。

这是我目前在我的init.js 文件中的设置,它将内容加载到第一页。它有效:

require(['jquery', 'ko', 'sammy', 'viewmodels/page1'], function($, ko, sammy, page1) {
  var page1VM = new page1.ViewModel();
  ko.applyBindings(page1VM);

  var app = sammy('#wrapper', function() {
    this.get('#page1', function() {
      page1VM.loadContent();
    });

    this.get('#page2', function() {
      // do nothing yet
    });

    [...]

    this.get('#pageX', function() {
      // do nothing yet
    });
  });

  app.run('#page1');
});

如何将我的其他视图模型绑定到其他页面?

我还尝试为this.get 中的每个页面添加一个单独的ko.applyBindings,当我切换回已经应用了这些绑定的页面时,这会引发错误。

【问题讨论】:

  • 您可能对 Durandal 感兴趣,它是一个框架,基本上为您将所有这些东西捆绑在一起。

标签: javascript knockout.js requirejs sammy.js


【解决方案1】:

http://jsfiddle.net/PgLgz/4/

好吧,我回到小提琴并清理了所有代码,以有效地向您展示我的答案的意思 -

function myViewModel() {
    var self = this;
    self.message = "hey";
    self.page1VM = new page1VM();
    self.page2VM = new page2VM();
    var app = sammy('#wrapper', function() {
        this.get('#page1', function() {
            page1VM .loadContent();
        });
    });
};

ko.applyBindings(new myViewModel());

请记住,虽然在小提琴中我不能真正使用 Sammy.js(我没有更改视图或导航)并且基本上没有理由使用 Require.js,因为它只是一个示例,我把所有视图模型在同一个 JS 文件中。

由于您使用的是 Sammy 和 Require,您需要获取此代码并将其在功能上应用到您的站点,或者在某处发布更多代码。

【讨论】:

  • 如果没有 applyBindings,它似乎无法工作。也许我做错了什么。这是 page1 视图模型:snippi.com/s/jwcf5zb
  • 是的,您仍然需要应用绑定,我将更新答案以包含该内容
  • 它为 applyBindings 行抛出“对象不是函数”错误。
  • 抱歉回复晚了。您的解决方案有效,但在之前的一次尝试失败后,我最终再次切换回 Durandal,它似乎可以更无缝地处理事情。
  • 太棒了,你会爱上 Durandal 的!
猜你喜欢
  • 1970-01-01
  • 2013-03-15
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 2014-03-06
  • 2012-03-13
  • 2017-10-28
相关资源
最近更新 更多