1

我在这里有一个场景,我需要使用属性绑定(attr)但是要应用的实际值是通过回调返回的,那么有没有办法让淘汰赛以某种方式成为回调意识?

我假设答案是否定的,我将需要使用其中一个异步淘汰插件,但由于其中一些需要脏标志等设置,我宁愿不要用这些东西使我的模型复杂化。

所以这是一个代码示例:

function SomeViewModel()
{
    var someStorageMechanism = new StorageMechanism();

    this.GetUserPicture = function(userId) {
        someStorageMechanism.GetUserData(userId, function(userData) {
            // should really be using a callback argument then do callback(userData.picture); but knockout has no notion of this
        });
    };
}

<img data-bind="attr: { src: GetUserPicture($data.userId) }"/>

在上面的示例中,GetUserPicture理想情况下应该返回图像数据字符串或 url,但是在这种情况下需要从异步工作的底层对象中检索数据,那么有没有简单的方法来解决这个问题?

4

1 回答 1

2

"is there any way to get knockout to somehow become callback aware?"

是的,您可以使用订阅。所有可观察对象、可观察数组和计算对象都继承自可订阅类型,因此您可以这样做:

var foo = ko.observable("foo");
foo.subscribe(function (newValue) {
  // When foo updates, this function is called
});

通过订阅,您甚至可以设置临时订阅并在以后不再需要它们时取消它们。

var fooSub = foo.subscribe(function (newValue) {
  // When foo updates, this function is called
});
// Somewhere else in the app...
fooSub.dispose();

默认情况下,订阅订阅一个名为“更改”的主题。这意味着当 observable 的值发生变化时,它会使用 newValue(因此是参数的名称)调用任何订阅者,但您也可以设置订阅主题“beforeChange”的订阅,以便在某个值之前执行逻辑变化。

foo.subscribe(function (oldValue) {
  // Do logic on the oldValue here
}, null, 'beforeChange');

您可以在淘汰赛的文档中了解这一点。但您也可以根据需要订阅自定义主题。默认情况下,当 observables 的值改变时,'beforeChange' 和 'change' 主题会在值改变之前和之后触发(分别)。但是您可以订阅自定义主题,稍后您可以手动触发该主题,以通知任何收听该主题的订阅者。

foo.subscribe(function (value) {
  // Do logic when observable notifies subscribers to the 'customTopic' topic
}, null, 'customTopic');

// Somewhere else in the app...
var value = "bar";
foo(value);
foo.notifySubscribers(value, 'customTopic');

通过这种方式,您可以在彼此没有直接引用的单独视图模型之间建立通信。这是我对如何执行此操作的粗略理解,您可以通过观看 Ryan Niemeyer 的提示和技巧视频了解更多信息。特别是订阅部分。

通过这种方式,您可以在淘汰赛中执行一种回调。还可以查看 Ryan 的Knockout-postbox库,该库将 observables 扩展为 subscribeTo 和 publishOn 这些主题。


您还可以查看 jQuery $.Deferreds,它是 $.ajax 请求使用的基础部分。这不是淘汰赛回调,而是一种回调。

让我知道这是否是您正在寻找的更多内容。

于 2013-09-05T19:32:45.160 回答