【问题标题】:Using sammy.js with Knockout.js to display single item from url使用 sammy.js 和 Knockout.js 从 url 显示单个项目
【发布时间】:2015-03-19 11:41:27
【问题描述】:

我正在尝试完成类似于官方 knockoutjs 教程的“单页应用程序”部分中所做的事情,其中​​我首先有多个视图工作,然后添加 sammy 以使其脱离 url。 在我的示例中,单击名称将列表视图替换为单个项目详细信息视图。

这是我的 jsfiddle:http://jsfiddle.net/of73rdxa/2/ 如果您取消注释第 104 行:

//self.chosenFriend(friend);

在我尝试介绍 sammy 并从 url 传递 id 之前,您可以看到我是如何做到这一点的。不幸的是,这不再是我需要的,因为我现在想从 url 中的 id 而不是 clicked 事件中获取结果。

注释掉第 112 行:

 //{ name: 'fred', age:  '12' }

显示将起作用的格式的静态示例。不幸的是,我的 getFriend 方法没有以正确的格式返回数据来完成这项工作。

【问题讨论】:

  • 仅供参考,我的公司开始使用淘汰赛制作 SPA,我们在复数视觉观看了 John Papa 的一个非常有用的教程,pluralsight.com/courses/spa。视频的一部分是他构建的代码营的示例解决方案,其中有一个使用 sammy、amplify、require 的完整工作 KO SPA 应用程序。它非常复杂,对我们帮助很大。我建议看看它。

标签: javascript knockout.js sammy.js


【解决方案1】:

问题在于getFriend().name 之类的不会计算任何东西,因为getFriend() 现在没有返回,并且不能同步返回异步 ajax 调用的结果。

相反,您可以向 getFriend() 传递一个回调,使其在 ajax 成功函数like so (jsfiddle) 的范围内:

self.getFriend = function(id, cb){
var getString = 'http://rest.learncode.academy/api/johnbob/friends/' + id;

$.ajax({
  type: 'GET',
  url: getString,
  success: function(data) {
    console.log("from getFriend", data); //returns friend id#1
    console.dir(data);
    cb(data);
  }
});
...
Sammy(function() {
    this.get('#:friendId', function() {
      self.getFriend(this.params.friendId, self.chosenFriend);
    });
}).run();

【讨论】:

  • 感谢 lossleader,我不确定我是否理解为什么“getFriend() 现在没有返回”以及为什么将 self.chosenFriend 作为回调传递来解决问题?
  • 所以 getFriend() 调用 $.ajax() 时没有返回语句,所以 getFriend() 是未定义的。如果您返回 $.ajax(..) 的结果,您仍然没有返回获取的数据,您正在返回获取此数据的承诺,因此无论哪种情况,getField() 的调用者都无法查看数据,它必须提供接收数据的功能。以下是 Promise 版本的示例:jsfiddle.net/bs9xfcwe/1
  • 感谢解释使用有什么区别
  • 感谢您的解释。使用 self.getFriend(this.params.friendId).then(self.chosenFriend); 有什么区别?没有回调,而不是 self.getFriend(this.params.friendId,self.chosenFriend); getFriend 中哪里定义了回调?
  • 因此,无论哪种情况,您实际上都是在设置一个函数,以便在 $.ajax 最终获得发出请求的结果时调用(这不是 $.ajax() 返回其调用者时。 ) 从传入回调切换到基于 Promise 构建可以使意图更清晰,代码更通用,但读者需要了解一些关于 Promise 的知识,即html5rocks.com/en/tutorials/es6/promises/#toc-lib-compatibility
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 2012-06-30
  • 2019-08-03
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 2012-12-18
  • 2012-02-01
相关资源
最近更新 更多