javascript中作为全局变量的敲除数组

javascript中作为全局变量的敲除数组,javascript,knockout.js,Javascript,Knockout.js,我可能会用这个来炫耀我的技能不足。但既然我完全支持学习,我愿意放下骄傲 在我的viewModel中,我定义: self.Tags() = ko.observableArray(); self.Skills() = ko.observableArray(); 然后我想保存我的标签。我在viewModel之外创建了此函数,我在其中进行了一些处理: function saveTags( category, mytagsArray) { ... } 我从viewModel中调用“saveTags”(

我可能会用这个来炫耀我的技能不足。但既然我完全支持学习,我愿意放下骄傲

在我的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…;)

尝试不使用():

self.Tags=foo
表示将self.Tags设置为foo
self.Tags()
在函数中表示self.Tags,您希望调用它。这些都是合法的声明。但是,
self.Tags()=foo
说self.Tags是一个您想要调用并将其值设置为foo的函数。。。这是没有意义的,在任何语言中都不是有效的代码。

请尝试不使用():


self.Tags=foo
表示将self.Tags设置为foo
self.Tags()
在函数中表示self.Tags,您希望调用它。这些都是合法的声明。但是,
self.Tags()=foo
说self.Tags是一个您想要调用并将其值设置为foo的函数。。。这没有意义,在任何语言中都不是有效代码。

您可以通过将viewmodel存储在如下变量中来访问它:

function ViewModel() {
     self.Tags = ko.observableArray();
     self.Skills = ko.observableArray();
}
my = { viewModel: new ViewModel() };
ko.applyBindings(my.viewModel);
然后您只需访问
my.Tags()


您可以通过将viewmodel存储在如下变量中来访问它:

function ViewModel() {
     self.Tags = ko.observableArray();
     self.Skills = ko.observableArray();
}
my = { viewModel: new ViewModel() };
ko.applyBindings(my.viewModel);
然后您只需访问
my.Tags()


这里的问题是您分配了
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();

这里的问题是分配
ko.observearray()
到调用的结果
self.Tags()
,这就是函数不存储在
self.Tags
变量中的原因。我想正确的代码应该是这样的:
如果要分配该调用的结果:

self.Tags = ko.observableArray();
self.Skills = ko.observableArray();
如果您希望分配函数链接以便稍后调用它们:

self.Tags = ko.observableArray;
self.Skills = ko.observableArray;
...
// somewhere later
self.Tags();
。尝试按以下方式定义视图模型:

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);
<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>
按如下方式定义您的html:

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);
<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>
添加
。尝试按以下方式定义视图模型:

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);
<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>
按如下方式定义您的html:

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);
<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>
添加

我只是复制粘贴了他的代码,没有签入。谢谢你,现在已经修好了谢谢@bircadian!这和我的模型很接近。在函数ViewModel(){}中,我有一个方法self.saveAll=function(){…}我想从这个函数中调用“saveTags()”作为外部函数。(如果我也将“self.SaveTags()”作为ViewModel的内部方法,我可以让它工作。那么我可以通过引用我的.Tasks()等来实现吗?我想是的。试试看。我只是复制粘贴了他的代码,没有签入。谢谢,现在已经修复了谢谢@Circadian!这与我的模型非常接近。在函数ViewModel()中{}我有一个方法self.saveAll=function(){…}就是从这个方法中,我想调用“saveTags()”作为一个外部函数。(如果我也将“self.saveTags()”作为一个ViewModel内部方法,我可以让它工作。那么,我是否可以通过引用我的.Tasks()来做到这一点等等?我想是的。试试看out@AsleG检查我的演示或我粘贴的示例代码。它使用对象文字的方式定义您的viewmodel。@正如您在addtag函数中看到的,我使用标记,tagtoadd属性,与您在SaveTags函数中使用的方式相同。只是名称不同,但它做的事情与我想象的相同例如,将项添加到数组。@AsleG如果我的示例演示或上述代码解决了您的问题,或通知您如何正确编写vm,请接受我的解决方案作为答案:P@AsleG检查我的演示或我粘贴的示例代码。它使用对象文字方式定义viewmodel。@正如您在addtag函数中看到的,我正在使用标记,tagtoadd属性,与您可以从SaveTags函数中使用的方法相同。只是名称不同,但它做的是相同的事情,我猜是将项添加到数组中。@AsleG如果我的示例演示或上述代码解决了您的问题,或通知您如何正确编写vm,请接受我的解决方案作为回答:Pcheck my demo或我粘贴的示例代码。它使用对象文字方式定义viewmodel。请检查我的演示或我粘贴的示例代码。它使用对象文字方式定义viewmodel。