Knockout-arrays作为javascript中的全局变量

时间:2013-10-14 13:12:02

标签: javascript knockout.js

我可能会用这个来炫耀我缺乏技巧。但既然我都是为了学习而愿意让自己感到骄傲......

在我的viewModel中我定义:

self.Tags() = ko.observableArray();
self.Skills() = ko.observableArray();

然后我要保存我的标签。我在viewModel之外创建了这个函数,在那里我做了一些处理:

function saveTags( category, mytagsArray) { ... }

我在viewModel中调用'saveTags(“skill”,Skills)'并得到此错误告诉我self.Tags()不是函数。

为什么我不允许在函数“saveTags”中引用self.Tags?

(请不要说它应该是LackOfSkills而不是Skills ......;)

4 个答案:

答案 0 :(得分:2)

尝试没有()' s:

self.Tags = ko.observableArray();
self.Skills = ko.observableArray();

self.Tags = foo说要设置自我。标记为foo。 self.Tags()说self.Tags在一个函数中,你想调用它。这些都是合法的陈述。但self.Tags() = foo表示self.Tags是一个你想要调用的函数,并将其设置为foo ...它没有任何意义,并且不是任何语言的有效代码。

答案 1 :(得分:1)

您可以通过将视图模型存储在如下变量中来访问您的视图模型:

function ViewModel() {
     self.Tags = ko.observableArray();
     self.Skills = ko.observableArray();
}
my = { viewModel: new ViewModel() };
ko.applyBindings(my.viewModel);

然后您只需访问my.Tags()

related answer

答案 2 :(得分:1)

此处的问题是您为调用ko.observableArray();的结果分配了self.Tags(),这就是您的函数未存储在self.Tags变量中的原因。我想正确的代码看起来像:
如果你想要分配那些电话的结果:

self.Tags = ko.observableArray();
self.Skills = ko.observableArray();

如果您想要指定函数链接以便稍后调用它们:

self.Tags = ko.observableArray;
self.Skills = ko.observableArray;
...
// somewhere later
self.Tags();

答案 3 :(得分:1)

Here is a demo pen for you。尝试定义您的视图模型:

var tagsViewModel = {
    // data
    tagToAdd: ko.observable(""), // this is the new tag to add
    tags: ko.observableArray([]), //empty collection
    skills: ko.observableArray([]),

// behaviors
    addTag: function () {
        var newTag = { Name: this.tagToAdd() };
        this.tagToAdd("");

        tagsViewModel.tags.push(newTag)

    }
};

ko.applyBindings(tagsViewModel);

像这样定义你的html:

<input type="text" placeholder="Add New Tag" data-bind="value: tagToAdd, valueUpdate: 'afterkeydown'" /> <button data-bind="click: addTag, enable: tagToAdd().length > 0" class="btn"><i class="icon-plus"></i> Add</button>

 <ul data-bind="foreach: tags" class="">
<!-- DEFINE UR LI HERE -->
</ul>