订阅者在Knockout.js中通知的顺序

时间:2015-10-09 10:59:10

标签: knockout.js knockout-3.0

我有一个包含行的表。 每次单击一行时,viewmodel都会使用订阅者将其通知给其他视图模型。

与此同时,每行都有图标。每当我点击一个图标时,我都会在我的一个视图模型中绑定一个函数click

现在,当我尝试从data绑定函数中的行中获取任何值时,会出现问题。

订阅似乎比点击功能晚了。因此,当我点击该功能时,我无法从该行访问数据。

我通过直接在click函数中填充行row来解决它。但是我希望能够从行外部访问click函数,比如说,在我的DOM中的固定元素或绝对元素中,因此我无法传递click数据来自它的self.sendDataAndClick = function(data){ self.setData(data); self.showAddModal(); }; //gets the info from the orders vm shouter.subscribe(function(data) { self.setData(data); }, this, "selectedOrder"); //sets the data for the viewmodel self.setData = function(data){ self.equipmentNumber(data.equipment_id()); self.leg(data); self.setSeals(data); } 绑定。这就是为什么我使用订阅者在行选择中被解雇的原因。

我的问题是。我们如何知道订户什么时候被解雇? 有没有办法改变顺序?

#include "stdio.h"
#include "time.h"
#include "string.h"
#include "cJSON.h"
#include "stdlib.h"
int checkUserRole(char *cmd);
int main(){

    char *cmd = "zwr ^A(\"A\")"; //string: zwr ^A("A")
    int v = checkUserRole(cmd);
    printf("%d",v);
    return 0;
}
int checkUserRole(char *cmd)
{
    const char *u ;
    u = getenv("USER");
    char *token;
    char *cmd_w_g;
    char *limiter ;
    if(strstr(cmd,"(") != NULL){
        limiter = "(";
        token = strtok(cmd,limiter);
        cmd_w_g = token;
    }
    char *cmd_qualifier;
    limiter = " ^";
    cmd_qualifier = strtok(cmd_w_g,limiter);
    char *cmd_q;
    cmd_q = cmd_qualifier;
    char *gbl ;
    gbl = strtok(NULL,limiter);


    char *fileName = "roles.cfg";
    char buff[512];
    FILE *file = fopen(fileName, "rt");
    char fileContent[1000000];

    while(fgets(buff, sizeof buff, file) != NULL){
         sprintf(fileContent,"%s%s",fileContent,buff);
    }   
    cJSON *root = cJSON_Parse(fileContent);
    cJSON *gbl_json = cJSON_GetObjectItem(root,gbl);
    cJSON *user_json =  cJSON_GetObjectItem(gbl_json,u);
    cJSON *cmd_json =  cJSON_GetObjectItem(user_json,cmd_q);
    char *role = cmd_json->valuestring;
    if(strstr(role,"true") != NULL){
        return 1;
    } else {
        return 0;
    }
}

1 个答案:

答案 0 :(得分:0)

好的,这就是我的理由。它可能无法完全回答您的问题,但它演示了如何控制订阅的执行顺序。

ko.extenders.queueSubs = function(target, value) {
    var sQueue = []; // subscription queue
    // set up a normal subscription and execute the queue subscriptions in order.
    target.subscribe(function(newValue) {
        sQueue.forEach(function(item, i) {
           sQueue[i](newValue);
        });
    });
    // overwrite the subscribe function of this observable into
    // a function that adds the subscription at a position in the queue
    target.subscribe = function(pos, fn) {
        sQueue.splice(pos, 0, fn);
    };
};
// use: ko.observable().extend({ queueSubs: true });
// queue a sub: ko.observable().subscribe(0, function(value) { alert(value); });

请在此处查看示例:http://jsfiddle.net/kevinvanlierde/6gsbghbb/

相关问题