【问题标题】:Creating a KnockoutJS observable with dynamic name创建具有动态名称的 KnockoutJS 可观察对象
【发布时间】:2013-03-29 05:35:30
【问题描述】:

我正在为我的应用程序使用我自己的简单模板系统,并且每页将加载未知数量的“相同”模板。

所以基本上,我通过 ajax 调用获取一些数据并获得一个 uniqueId。然后,我将一个模板加载到我的页面中,并使用 uniqueId 应用 id 和 data-bind="with:"。

<div id="content-uniqueId">
    <div data-bind="with: uniqueId">
        ...
    </div>
</div>

然后我调用一个函数并尝试使用 uniqueId 创建一个 observableArray,以便它绑定到我的“with”。

类似:

function(uniqueId) {
     var theObservable = uniqueId;
     theObservable = ko.observableArray(); // make the observable name equal to uniqueId
     // get some data
     theObservable(new data);
}

我创建了一个 JS Fiddle 来帮助解决问题,但它不起作用,因为我没有获取 ajax 数据或传递唯一 ID。

JS Fiddle here

编辑:

Updated JS Fiddle,根据 Tyrsius 的以下建议。

this[uniqueId] = ko.observableArray(new entityApp.dataContext.EntityModel(data));

绝对接近一步,但我收到一个错误:

初始化可观察数组时传入的参数必须是数组,或者null,或者undefined

但是'new entityApp.dataContext.EntityModel(data)'返回一个对象数组,所以应该没问题。

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    Javascript 使用其对象索引器使动态分配和反射变得简单:

    var ViewModel = function(propName) {
        this[propName] = ko.observable("reflection");
    };
    
    ko.applyBindings(new ViewModel("dynamic"));
    

    这里是a fiddle 演示绑定。

    【讨论】:

    • 谢谢,我现在又近了一步。但是我仍然遇到错误(请参阅上面的编辑)。更新了您的 JS Fiddle,使其更符合我的情况。我不明白为什么它不起作用,但我可能还在做一些愚蠢的事情。 jsfiddle.net/FHz4k/3
    • 您的问题是theArray 是一个对象,而不是一个数组。你想要theArray.names,还是ko.observableArray([theArray])
    • 嗯。我不知道。当我不使用这些动态 uniqueIds 时,使用该数据可以正常工作 var obs = ko.observableArray();然后 obs(新 entityApp.dataContext.EntityModel(data));我不知道。我很感激帮助。我可能不得不重新考虑我的方法。
    • 在构建过程中会抛出错误;如果您尝试在构造后将对象传递给 observableArray,则将其转换为非数组 observable。除非您的数据已更改,否则您所描述的内容将无法正常工作。看一看:jsfiddle.net/bQjTV/1。注意html
    • 对。好电话 - 这非常有帮助。当我切换到动态 ID 时,我一定搞砸了其他东西。我不会回去,让它在没有动态 ID 的情况下工作,并将重新开始,记住这一点。我不确定我做错了什么,但会弄清楚的。我还没有解决,但会将您的帖子标记为正确答案,因为它有很大帮助。感谢您的观看!
    猜你喜欢
    • 1970-01-01
    • 2012-04-20
    • 2012-12-12
    • 2017-11-25
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    相关资源
    最近更新 更多